Различия между указателями и ссылками

Переменные-ссылки и указатели имеют как сходство, так и различия. Сходство заключается в том, что и те, и другие хранят адреса. Различия состоят в следующем.

• Переменная-ссылка должна инициализироваться при объявлении, тогда как при объявлении указателя нет необходимости инициализировать его.

• Указателю можно присваивать адрес переменной где угодно в программе, однако переменной-ссылке нельзя присваивать новую ссылку.

• При использовании указателя для доступа к данным соответствующей переменной необходим оператор разыменования *, тогда как переменной-ссылке не требуется оператор разыменования *, поскольку сама переменная-ссылка является псевдонимом (вторым именем) переменной, на которую она ссылается.

Указатели на указатели

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: