Не существует фиксированного ответа; он полностью зависит от архитектуры, реализации компилятора и даже от типа самого указателя. У указателей на разные типы не гарантируется одинаковый размер и/или представление.
Например, предположим, что архитектура с адресатом, где наименьшая адресуемая единица хранения составляет 16 бит в ширину (или шире). Каждое слово может содержать несколько значений char
; все остальные типы занимают полное слово или больше. В такой архитектуре char *
и void *
потребуются дополнительные биты для смещения в слово по сравнению с другими типами указателей.
Обратите внимание, что тип указателя может быть шире, чем количество бит, фактически необходимых для хранения адреса. Оригинальный Macintosh работал на процессоре Motorola 68000, который имел размер 32-битного слова, но только 24 бит на адресной шине. Типы указателей были 32 бит в ширину, оставляя верхние 8 бит неиспользованными. Предприимчивые программисты MacOS воспользовались этим, чтобы хранить некоторые данные в самом верхнем байте типа указателя, используя большую часть этого драгоценного 128 КБ ОЗУ. Конечно, Motorola в конце концов выпустила процессор с 32 адресными строками (68020), что означает, что весь этот код пришлось переписать.
На современном товарном настольном и серверном оборудовании (читайте: x86) можно с уверенностью предположить, что все типы указателей имеют такой же размер, как размер родного слова (32- или 64-разрядный), и что все типы указателей имеют одинаковый размер и представление. Просто имейте в виду, что это не имеют значение, чтобы быть правдой.
Дубликат http://stackoverflow.com/questions/1473935/can-the-size-of-pointers-vary-depending-on-whats-pointed-to – Daniel
@alk Я предполагаю, что это опечатка, и он означает 64 бит в # 1 – Leeor
@alk @ Leeor Да, я 64 бит. – GovernmentFX