4.2 Ссылки
Ссылки появились в языке С++ позднее, чтобы упростить работу с указателями. По сути, ссылка – это тоже указатель, только неявный. Ссылка – это псевдоним (второе имя) существующей переменной. Работа со ссылкой похожа на работу с обычной переменной. Общий синтаксис для объявления ссылки:
Тип& ИмяСсылки = ИмяПеременной;
Тип &ИмяСсылки = ИмяПеременной; // РЕКОМЕНДУЕТСЯ!
Знак & в данном случае не означает операцию взятия адреса. Если он используется при объявлении переменной, то это означает объявление переменной-ссылки.
Ссылка должна обязательно инициализироваться при объявлении. Нельзя объявить ссылку, не указав, на какую переменную она ссылается.
Исключением является ссылка, используемая в качестве параметра функции. Параметр-ссылка может быть просто объявлен, а его инициализация произойдет в момент вызова функции.
В следующем примере объявлены переменные A и B типа int, а также ссылка pA на переменную A. Это означает, что у переменной A появилось второе имя pA, и теперь можно обращаться к одной и той же переменной, используя любое из этих имен. Ссылке pA присваивается значение 10, а затем печатается значение переменной A, которое также будет равно 10.
Однако нельзя впоследствии установить ту же ссылку pA на другую переменную B. Это объясняется тем, что ссылка не занимает места в памяти, поэтому она не может изменять свое значение в процессе работы в отличие от обычных переменных и переменных-указателей, которые занимают место в памяти.
int A, B;
int &pA = A;
A = 10;
printf(“pA = %d”, pA); // будет напечатано pA = 10
pA = 20;
printf(“A = %d”, A); // будет напечатано A = 20
pA = B; // ОШИБКА !
Ссылки значительно упростили работу с указателями. Они не требуют использования операции разадресации (или разыменования) указателя * для того, чтобы получить значение по указанному адресу.
ЗАМЕЧАНИЕ. Разумеется, нет никакой необходимости в использовании нескольких имен для одной и той же переменной. Поэтому основное назначение ссылок – это передача параметров функциям.
Различия между указателями и ссылками
Переменные-ссылки и указатели имеют как сходство, так и различия. Сходство заключается в том, что и те, и другие хранят адреса. Различия состоят в следующем.
• Переменная-ссылка должна инициализироваться при объявлении, тогда как при объявлении указателя нет необходимости инициализировать его.
• Указателю можно присваивать адрес переменной где угодно в программе, однако переменной-ссылке нельзя присваивать новую ссылку.
• При использовании указателя для доступа к данным соответствующей переменной необходим оператор разыменования *, тогда как переменной-ссылке не требуется оператор разыменования *, поскольку сама переменная-ссылка является псевдонимом (вторым именем) переменной, на которую она ссылается.
4.3 Указатели на указатели
C++ позволяет объявлять указатель на другой указатель. Общий синтаксис для объявления указателя на указатель:
Тип** ИмяУказателя;
Пример:
int A = 18;
int *pA = &A;
int **ppA = &pA;
int ***pppA = &ppA;
printf(“A = %d”, A); // вывод, используя переменную А
printf(“A = %d”, *pA); // вывод, используя указатель pА
printf(“A = %d”, **ppA); // вывод, используя указатель ppА
printf(“A = %d”, ***pppA); // вывод, используя указатель pppА
