Каков размер указателя?
Является ли размер указателя таким же, как размер, как тип, на который он указывает, или указатели всегда имеют фиксированный размер? Например...
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 указателя фактически вернут одинаковый размер? Причина, по которой я спрашиваю об этом, заключается в том, что указатели сохраняют адрес памяти, а не значения их соответствующих сохраненных адресов.
Ответы
Ответ 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
Размер указателя - это размер, необходимый вашей системе для хранения уникального адреса памяти (поскольку указатель просто держит адрес, на который он указывает)