Вопрос
Вопрос о том, одинаковы ли все указатели, полученные из указателей на типы структур, нелегко ответить. Я считаю, что это важный вопрос по двум основным причинам.
A. Отсутствие указателя на указатель на "любой" неполный или тип объекта накладывает ограничение на удобные функциональные интерфейсы, такие как:
int allocate(ANY_TYPE **p,
size_t s);
int main(void)
{
int *p;
int r = allocate(&p, sizeof *p);
}
Существующий указатель на "любой" неполный или тип объекта явно описывается как:
C99
/C11
§6.3.2.3 p1
:
Указатель на void может быть преобразован в указатель или из указателя на любой неполный или тип объекта. [...]
Указатель, полученный из существующего указателя на "любой" неполный или тип объекта, указатель на указатель на void, является строго указателем на указатель на void и не требуется конвертировать с указателем, производным от указателя на ' любой "неполный или тип объекта.
B.. Для программистов нередко использовать соглашения на основе предположений, которые не требуются, связанные с обобщением указателей, сознательно или неосознанно, в зависимости от их опыта с их конкретными реализациями. Предположения, такие как быть конвертируемыми, представляются как целые числа или совместно используют общее свойство: размер объекта, представление или выравнивание.
Слова стандарта
Согласно C99 §6.2.5 p27
/C11 §6.2.5 p28
:
[...] Все указатели на типы структуры должны иметь одинаковые требования к представлению и выравниванию друг к другу. [...]
Далее следует C99 TC3 Footnote 39
/C11 Footnote 48
:
Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращают значения из функций и членов союзов.
Хотя стандарт не говорит: "Указатель на тип структуры" и выбраны следующие слова: "Все указатели на типы структуры", он явно не указывает, относится ли это к рекурсивному выводу таких указатели. В других случаях, когда в стандарте упоминаются специальные свойства указателей, в нем явно не указывается или не упоминается рекурсивный вывод указателя, что означает, что применяется либо "деривация типа", либо нет, но он явно не упоминается.
И хотя фраза "Все указатели на" при обращении к типам используется только дважды, (для типов структуры и объединения), в отличие от более явной фразы: "Указатель на", который используется по всему стандарту, мы не можем заключить, относится ли оно к рекурсивному выводу таких указателей.