Переменные-ссылки и указатели имеют как сходство, так и различия. Сходство заключается в том, что и те, и другие хранят адреса. Различия состоят в следующем.
• Переменная-ссылка должна инициализироваться при объявлении, тогда как при объявлении указателя нет необходимости инициализировать его.
• Указателю можно присваивать адрес переменной где угодно в программе, однако переменной-ссылке нельзя присваивать новую ссылку.
• При использовании указателя для доступа к данным соответствующей переменной необходим оператор разыменования *, тогда как переменной-ссылке не требуется оператор разыменования *, поскольку сама переменная-ссылка является псевдонимом (вторым именем) переменной, на которую она ссылается.
Указатели на указатели
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А
Указатели и массивы
Указатели являются прекрасным средством доступа к элементам массива. Рассмотрим, как установить связь между указателями и массивами, а также как применять адресную арифметику к указателям.
В языке C++ имя массива считается указателем на первый элемент этого массива. Таким образом, можно присваивать указателю адрес первого элемента массива, просто используя имя массива, например:
int Array [10];
int *pArray = Array;
ИЛИ
int *pArray = &Array[0];
Благодаря этому можно использовать арифметику указателей, которая реализуется с помощью операций +, -, ++, --. При использовании этих операций с указателем они увеличивают и уменьшают его адрес таким образом, что он указывает на следующий или предыдущий элемент массива. Адрес, который хранится в указателе, изменяется на величину, кратную размеру элемента массива.
Пример:
const int Nmax = 4;
int Array[Nmax] = {10, 20, 30, 40};
int *pA = Array; // int *pA = &Array[0];
printf(“ %d ”, *pA); // будет напечатано 10
printf(“ %d ”, *pA++); // 20
printf(“ %d ”, *pA++); // 30
printf(“ %d ”, *pA++); // 40