Могу ли я использовать арифметику указателей для указателей, чтобы аннулировать указатели? - PullRequest
0 голосов
/ 06 сентября 2018

Я знаю, что вы не можете использовать арифметику с указателями на пустых указателях, но теоретически вы могли бы сделать арифметику с указателями на указателях на пустые указатели, поскольку sizeof(void *) даст ответ о том, сколько байтов занимает указатель в вашей системе?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Арифметика указателей недопустима для void*, поскольку void является неполным типом объекта.

Из проекта комитета C N1570:

6.5.6 Аддитивные операторы
...
2. Кроме того, либо оба операнда должны иметь арифметический тип, либо один операнд должен быть указателем на полный тип объекта , а другой должен иметь целочисленный тип.

Но это разрешено для void**, потому что void* НЕ является неполным типом объекта. Это как указатель на тип символа.

6.2.5 Типы
...
19. Тип void содержит пустой набор значений; это неполный тип объекта , который не может быть завершен.
...
28. Указатель на void должен иметь те же требования к представлению и выравниванию , что и указатель на тип символа .

0 голосов
/ 06 сентября 2018

Да, арифметика указателей работает с указателями на недействительные указатели (void**). Только void* является особенным, void** не является.

Пример:

void *arrayOfVoidPtr[10];
void **second = &arrayOfVoidPtr[1];
void **fifth = second + 3; // pointer arithmetic
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...