Вы можете помочь мне понять указатели и адреса?

Сколько байтов я могу хранить в одном адресе ОЗУ?

А каков размер одного указателя?

Я просто не уверен в этих основных концепциях, и мне нужна небольшая помощь. Спасибо вам всем.


person Don Lun    schedule 26.03.2011    source источник


Ответы (2)


Обычно вы можете хранить один байт на ячейку памяти. (Старые машины могли использовать неоктетные размеры слова, и эти машины могли хранить один полубайт или 12 или 24 бита на ячейку памяти.) Но в наши дни 8 бит - это один байт, и один байт - это одна ячейка памяти, хотя это может быть не размер слова машины.

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

Что меня бесконечно смутило при первом запуске C, так это то, что ячейка памяти, на которую указывает указатель, увеличивает различные значения в зависимости от типа данных указателя.

char *c;
int *i;

При использовании смещения или увеличения указателей (c+1 или i+1) компилятор добавит 1 для указателя char * и 4 или 8 для указателя int *. В моем ассемблере таких тонкостей не было, и мне потребовались месяцы, чтобы понять, что «компилятор C знает размеры типов, просто доверяйте ему».

person sarnold    schedule 26.03.2011
comment
спасибо, сарнольд. Для меня очень красивое яркое и понятное объяснение. - person Don Lun; 26.03.2011

Указатель обычно имеет 4 байта в 32-битных системах и 8 байтов в 64-битных системах, но это не фиксировано и может зависеть от системы.

Адрес - это просто позиция в вашей памяти, и указатель относится к ней. Но данные могут быть более одного байта - указатель просто показывает, где находится первый байт.

person MacGucky    schedule 26.03.2011