Арифметика указателей на указатели на указатели и тому подобное - PullRequest
3 голосов
/ 06 октября 2011

Правильно ли определено использование арифметики указателей на указателях на указатели?например,

int a=some_value;
int* p=&a;
int**p2=&p;

Теперь было бы правильно определить поведение для выполнения арифметики на p2? (например, p2 + 1, p2 + 2 и т. д.)

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

Другой ответ совершенно неправильный:

int *p = &a;

объявляет единственную переменную-указатель (не массив указателей).Это эквивалентно WRT-индексации с массивом с одним элементом:

int *(array[1]) = { &a };

, так что вы можете сделать (&array[0]) + 1 или array + 1, или p + 1, потому что формируете одно прошлоеуказатель конца допускается: указатель «один за концом» указывает на воображаемый элемент, который находится сразу после конца массива.Указатель "один за концом" не разыменовывается, поскольку он указывает на отсутствие реального объекта.

Но вы не можете вычислить любое другое значение указателя .

В частности, p+2 является , а не действительным.

1 голос
/ 06 октября 2011

Конечно!

p + n

, где p - указатель, а n - целое число, всегда четко определенное.Он генерирует адрес, который "в n раз больше размера элемента p указывает на" байтов от p.В этом случае p2 является указателем на указатель.Таким образом, p2 + 4 является адресом "4 * the-size-of-pointers" байтов за p2.

Поскольку вы указываете на локальные переменные в вашем конкретном примере, это будет странноНо это не будет незаконным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...