Указатель имеет «двойной тип». С одной стороны, это указатель с собственным размером (скажем, 4 байта для каждого указателя в некоторых системах). С другой стороны, это указатель на то, что имеет размер (кроме void *
).
Типы, как правило, напрямую недоступны в C. Вы не можете спросить, "каков тип переменной".
Но размер всегда доступен через sizeof
. Таким образом, int *
сам может использовать 4 байта, но компилятор знает, что он указывает на целое число, и знает размер целого числа.
Для struct xyz *
сам указатель может снова составлять 4 байта, но компилятор знает, что он указывает на структуру, и знает размер структуры. Важно то, что указатель имеет тип за пределами «указателя».
Итак, если вы определите struct xyz *ptr
, вы всегда можете узнать размер того, на что указывает указатель, проверив sizeof(*ptr)
. Вы можете сделать это, даже если ptr
не инициализирован.
Единственное, что вы не можете сделать, это проверить sizeof(*ptr)
, когда определено ptr
void *
.
С точки зрения "метаданных", все это в виде указателя.