Полагаю, вы упускаете из виду тот факт, что указатель также является типом , отдельным, как стандартные целочисленные типы, плавающие типы и т. Д.
Цитата C11
, глава §6.2.5
- Тип указателя может быть получен из типа функции или типа объекта, называемого
ссылочный тип. Тип указателя описывает объект, значение которого предоставляет ссылку
к объекту ссылочного типа. Тип указателя, полученный из ссылочного типа T
иногда называется «указатель на T». [...]
Этот тип предназначен для хранения адреса другого типа (включая сам тип указателя). Точно так же как int
предназначен для хранения целочисленных значений и double
или float
для значений с плавающей запятой. Не существует отдельной структуры данных , необходимой или обязательной для типов указателей, просто определено, что она может содержать адрес как значение переменной указателя.
FWIW, в заголовке stdint.h
определены другие типы, которые могут содержать адрес в качестве значения:
Следующий тип обозначает целочисленный тип со знаком со свойством, которое любое допустимое
указатель на void может быть преобразован в этот тип, затем преобразован обратно в указатель на void,
и результат будет сравниваться равным исходному указателю:
intptr_t
Следующий тип обозначает целочисленный тип без знака со свойством, которое любое допустимое
указатель на void может быть преобразован в этот тип, затем преобразован обратно в указатель на void,
и результат будет сравниваться равным исходному указателю:
uintptr_t
Эти типы являются необязательными.
О возможном использовании см. Что такое intptr_t?