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

Связь указателей и массивов с одним измерением справедливо и для массивов с большим числом измерений. Например, рассмотрим двухмерный массив

float name[5][10];

Если рассматривать его как массив пяти массивов размерностью по десять элементов каждый, то очевидна схема его размещения в памяти - последовательное размещение «строк» элементов. Обращению к элементам name[i][j] соответствует эквива­лентное выражение *(*(name+i)+j), а объявление этого массива указателем будет:

float **name;

Таким образом, имя двухмерного массива - имя указателя на указатель. Аналогичным образом можно установить соответствие между указателями и массивами с произвольным числом измерений. Количество символов «*» определяет уровень вложенности указателей друг в друга. При объявлении указателей на указатели возможна их одновременная инициализация.

Например:

int a=5;

int *p1=&a;

int **pp1=&p1;

int ***ppp1=&pp1;

Теперь присвоим целочисленной переменной а новое значение, например, 10. Одинаковое присваивание произведут следующие операции:

a=10; *p1=10; **pp1=10; ***ppp1=10;

Для доступа к области памяти, отведенной под переменную а, можно использовать и индексы. Справедливы следующие аналоги:

*p1 равносильно p1[0]

**pp1 равносильно pp1[0][0]

***ppp1 равносильно ppp1[0][0][0]

Таким образом, указатели на указатели – это имена многомерных массивов.


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



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