Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
14
Добавлен:
17.04.2015
Размер:
28.48 Кб
Скачать

4. Передача параметров по ссылке в Си.

В Си можно передавать параметры по ссылкам. Пример из предыдущего абзаца теперь выглядит так:

void foo (int& x)

{

x = 17;

}

Int main ()

{

int z = 5;

foo (z); // теперь z=17

}

Однако, в таком варианте использования ссылок программисту приходится быть осторожным при передаче значений в функцию стороннего разработчика, если не планируется изменение передаваемой переменной: только функции с прототипом

void foo (const int& x);

гарантируют неизменность передаваемого значения.

спользование ссылок для изменения параметров функции

Мы знаем, что наши программы с помощью указателей могут изменять значение параметров внутри функции. Для изменения параметра вы должны передать его адрес в функцию. Чтобы получить адрес параметра, используйте оператор адреса C++ (&). В свою очередь функция использует переменные-указатели (которые хранят адрес памяти). Для объявления переменной-указателя внутри функции предваряйте имя параметра звездочкой (*). Чтобы изменить или использовать значение параметра внутри функции, предваряйте каждое обращение к имени этого параметра оператором разыменования C++ (*). К сожалению, многие операции внутри функции комбинируют переменные-указатели и переменные-неуказатели.

Ссылки C++ упрощают процесс изменения параметров функции, избавляя от операторов, которые смешивают переменные-указатели и переменные-неуказатели.

5. Отличие ссылок от указателей.

Ссылку в Сможно понимать или как альтернативное имя объекта, или как безо-пасный вариант указателей. Ссылки имеют три особенности, отличающие их от указателей.

При объявлении ссылка обязательно инициализируется ссылкой на уже существующий объект данного типа.

Ссылка пожизненно указывает на один и тот же адрес.

При обращении к ссылке операция * производится автоматически.

Что произошло в предыдущем разделе? Аргумент функции foo стал не указателем, а ссылкой. Поэтому теперь:

при вызове функции foo компилятор сам передаст адрес переменной z, нет необходимости специально его просить;

внутри функции foo мы обращаемся с x, как с обычной переменной, и только компилятор знает, что внутри это — указатель.

6. Использование ссылок.

Итак, мы можем передавать по ссылкам параметры. Но ссылки могут существовать и сами по себе, вне всякой связи с передачей параметров.

Пример:

int x = 10;

int& y = x; // Теперь y - ссылка на int, указывающая на x.

Y = 20; // теперь x==20

printf("x=%d y=%d\n", x, y); // напечатается "x=20 y=20"

/* int& z; */ // Запрещено! Ссылки надо инициализировать!

Ссылка может указывать и на элемент массива

double a[5];

double& b=a[3]; // Теперь b указывает на a[3].

b = 1.5; // то же самое, что а[3]=1.5;

b++; // то же самое, что а[3]++ . Теперь а[3]==2.5

Кроме того, функции могут и возвращать значение по ссылке:

double& Third(double* x) {return x[2];}

double a[5];

Third(a)=1.5; // теперь а[2]=1.5

Third(a)++; // теперь а[2]=2.5

В таком случае вызов функции становится lvalue. Более того, вызов функции есть lvalue тогда и только тогда, когда функция возвращает ссылку.