Данные хранятся в памяти. Эта память имеет адрес. Указатели содержат адрес памяти, для которого данные начинаются .
В частности, указатели обычно содержат адрес «первого байта» данных, в котором находится тип (обратите внимание, что технически первый байт может содержать последние биты данных, в зависимости от endianness ).
, т. е. если long double
равен 128 битам (16 байтов), значение указателя будет указывать на первый байт, а тип указателя будет указывать количество байтов, которые должны быть прочитаны.
Если вы "приведете" указатель long double
в примере к int *
( указатель int
), будут считаны только sizeof(int)
байтов - но значение, адрес первого байта, останется прежним.
Следовательно, значение указателя не учитывается в размере данные, указатель должен быть достаточно большим, чтобы содержать адрес первого байта. По этой причине обычно указатели имеют одинаковую длину, полученную из «адресного пространства» компьютера .
. Это очень похоже на карточку каталога в библиотеке. Так же, как «адрес книги» в библиотеке зависит от размера библиотеки, значение указателя (адрес памяти) зависит от размера «адресного пространства» компьютера, не от размера типа .
На большинстве 32-битных и 64-битных процессоров адресное пространство ограничено 32 или 64 битами. Однако в некоторых системах есть специальные адресные пространства для специальных указателей (таких как указатели функций) ... это в основном устарело. Он больше использовался, когда CPUS был меньше 32 бит, а «адресное пространство» было ограничено.
Обратите внимание, что значения в адресном пространстве (указатели) могут указывать на любое местоположение на оборудовании (обычно это байт в память, но иногда регистр или часть аппаратного обеспечения) ... вот почему ОС (ядро), используя некоторую аппаратную поддержку, обычно предоставляет «виртуальное» адресное пространство для каждого процесса, защищая оборудование и другие обработанные от неправильной работы process.
PS
Мне понравился ответ, данный @linuxfansaysReinstateMonica ... Однако я обнаружил, что хочу уточнить некоторые сведения в этом ответе. Вы должны действительно прочитать это. Этот ответ является главным пояснением для их ответа.