- •Определение и задание ссылок.
- •Правила для ссылок.
- •3. Передача параметров в Си.
- •Int main ()
- •4. Передача параметров по ссылке в Си.
- •Int main ()
- •5. Отличие ссылок от указателей.
- •6. Использование ссылок.
- •7. Чего нельзя делать со ссылками.
- •Примеры использования ссылок.
- •Отличие ссылок от указателей.
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 тогда и только тогда, когда функция возвращает ссылку.