Подтвердить что ты не робот

Каков размер указателя?

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

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) return 1, или 2 указателя фактически вернут одинаковый размер? Причина, по которой я спрашиваю об этом, заключается в том, что указатели сохраняют адрес памяти, а не значения их соответствующих сохраненных адресов.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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