Каков размер указателя? - PullRequest
54 голосов
/ 19 июля 2011

Является ли размер указателя таким же, как размер и тип, на который он указывает, или указатели всегда имеют фиксированный размер? Например ...

int x = 10;
int * xPtr = &x;
char y = 'a';
char * yPtr = &y;

std::cout << sizeof(x) << "\n";
std::cout << sizeof(xPtr) << "\n";
std::cout << sizeof(y) << "\n";
std::cout << sizeof(yPtr) << "\n";

Каким будет результат этого? sizeof(xPtr) вернет 4 и sizeof(yPtr) вернет 1, или 2 указателя на самом деле вернут одинаковый размер? Я спрашиваю об этом потому, что указатели хранят адрес памяти, а не значения их соответствующих сохраненных адресов.

Ответы [ 7 ]

70 голосов
/ 19 июля 2011

Функциональные указатели могут иметь очень разных размеров , от 4 до 20 байт на машине X86, в зависимости от компилятора.Таким образом, ответ НЕТ - размеры могут варьироваться.

Другой пример: возьмите программу 8051, она имеет три диапазона памяти и, таким образом, имеет три разных размера указателя: 8-битный, 16-битный, 24-битный, в зависимости от того, где находится цельнаходится, хотя размер цели всегда одинаков (например, char).

69 голосов
/ 19 июля 2011

Указатели обычно имеют фиксированный размер, например на 32-битном исполняемом файле они обычно 32-битные. Есть некоторые исключения, например, в старых 16-битных окнах, когда нужно было различать 32-битные указатели и 16-битные ... Обычно довольно безопасно предполагать, что они будут единообразными в пределах данного исполняемого файла на современных настольных ОС. .

Редактировать: Тем не менее, я бы настоятельно рекомендовал не делать этого предположения в вашем коде . Если вы собираетесь написать что-то, что обязательно должно иметь указатели определенного размера, вам лучше это проверить!

Указатели функций - это отдельная история - для получения дополнительной информации см. Ответ Дженса .

15 голосов
/ 19 июля 2011

На 32-разрядном компьютере размер указателя составляет 32 бита (4 байта), а на 64-разрядном компьютере - 8 байт. Независимо от того, на какой тип данных они указывают, они имеют фиксированный размер.

8 голосов
/ 02 октября 2012

Указатели не всегда имеют одинаковый размер на одной архитектуре.

Вы можете прочитать больше о понятии «ближний», «дальний» и «огромный» указатели, так же как пример случая, когда размеры указателя отличаются ...

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

8 голосов
/ 20 июля 2011

Чтобы ответить на другой ваш вопрос. Размер указателя и размер того, на что он указывает, не связаны. Хорошая аналогия - считать их почтовыми адресами. Размер адреса дома не имеет отношения к размеру дома.

2 голосов
/ 12 июня 2015

Они могут отличаться на машинах с адресацией по словам (например, системы Cray PVP).

Большинство современных компьютеров являются машинами с байтовой адресацией, где каждый адрес относится к байту памяти. Там все указатели данных обычно имеют одинаковый размер, а именно размер машинного адреса.

На машинах с адресом слова каждый адрес машины вместо этого относится к слову, превышающему байт. На них указатель (char *) или (void *) на байт памяти должен содержать как адрес слова, так и смещение байта в добавляемом слове.

http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

0 голосов
/ 19 июля 2011

Размер указателя - это размер, необходимый вашей системе для хранения уникального адреса памяти (поскольку указатель просто содержит адрес, на который он указывает)

...