Передача параметров в языках С и С++. Передача параметров в языках с и С Передача данных через глобальные переменные
Скачать 64.74 Kb.
|
Передача параметров в языках С и С++Передача данных через глобальные переменные#include void f(); float a,p,s; int main(){ scanf("%f",&a); f(); printf("a=%f p=%f s=%f",a,p,s); } void f() { p=4*a; s=a*a; } рис. 1 Передача данных через указатели в стиле языка СВ некоторых ситуациях, где требуется косвенное обращение, C++ настаивает на использовании указателей. Принятие решения, использовать ли указатели вместо ссылок, или наоборот, часто является вопросом выбранного стиля программирования. Размер указателя в основном зависит от архитектуры системы, в которой он реализован. Например, размер указателя в 32 битах составляет 4 байта (32 бит) и 8 байт(64 бит) в 64-битных машинах. Возьмем за основу х64 архитектуру. После выполнения функции main() ячейки локальных переменных очищаются. #include void f(float a, float *p, float *s); int main(){ float al,pl,sl; scanf("%f",&al); f(al,&pl,&sl); printf("a=%f p=%f s=%f",al,pl,sl); } void f(float a, float *p, float *s){ *p=4*a; *s=a*a; } рис. 2 Передача данных по ссылке в стиле языка С++Стандарт C++ старательно избегает диктовать правила, каким образом компилятор должен реализовать поведение ссылок, однако любой компилятор C++ реализует ссылки как указатели. Так что декларация ссылки если не будет полностью оптимизирована, то выделит такое же количество памяти, как и для указателя, и поместит адрес переменной i в это хранилище. Таким образом, и указатель, и ссылка занимают одинаковый объем памяти. #include void f(float a, float &p, float &s); int main(){ float al,pl,sl; scanf("%f",&al); f(al,pl,sl); printf("a=%f p=%f s=%f",al,pl,sl); } void f(float a, float &p, float &s){ p=4*a; s=a*a; } рис. 3 Отличия ссылок от указателей:1. Указатель может быть переназначен любое количество раз, в то время как ссылка после привязки не может быть перемещена на другую ячейку памяти. То есть указатель может указывать на разные объекты в течение своей жизни, ссылка может обращаться только к одному объекту в течение своей жизни. Это значимое отличие ссылок и указателей. 2. Указатели могут указывать "в никуда" (быть равными NULL), в то время как ссылка всегда указывает на определенный объект. 3. Вы не можете получить адрес ссылки, как можете это делать с указателями. 4. Не существует арифметики ссылок, в то время как существует арифметика указателей. Однако есть возможность получить адрес объекта, указанного по ссылке, и применить к этому адресу арифметику указателей (например &obj + 5). |