У указателя также есть адрес или выделение памяти? - PullRequest
7 голосов
/ 13 июня 2009

Если указатель хранит адрес переменной ... тогда откуда мы получаем указатель?

Я спросил, что если мы используем указатель напрямую, то должно быть место, откуда мы получаем этот указатель?

Ответы [ 5 ]

26 голосов
/ 13 июня 2009

Да, объявленный указатель имеет свое собственное местоположение в памяти.

alt text

В приведенном выше примере у вас есть переменная 'b', в которой хранится значение "17".

int b = 17;    /* the value of 'b' is stored at memory location 1462 */

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

int *a;
a = &b;       /* the pointer 'a' is stored at memory location 874 */

Работа компилятора заключается в том, чтобы знать, где "взять указатель". Когда ваш исходный код ссылается на указатель «a», компилятор переводит его в -> «любое значение адреса хранится в ячейке памяти 874».

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

10 голосов
/ 13 июня 2009

Да. Ниже у меня есть int и указатель на int и код для распечатки адреса памяти каждого.

int a;
printf("address of a: %x", &a);

int* pA = &a;
printf("address of pA: %x", &pA);

Указатели в 32-битных системах занимают 4 байта.

4 голосов
/ 13 июня 2009

Посмотрите на этот пост для лучшего понимания указателей. Каковы барьеры для понимания указателей и что можно сделать, чтобы их преодолеть?

Что касается вашего вопроса, если я понимаю, что вы хотите, то, в основном, когда вы объявляете указатель, вы указываете адрес или числовой индекс, который назначается каждой единице памяти в системе (обычно это байт или словом). Затем система предоставляет операцию для извлечения значения, хранящегося в памяти по этому адресу.

3 голосов
/ 13 июня 2009

В С:

char *p = "Here I am";

p затем сохраняет адрес, где хранится «H». p является переменной. Вы можете взять указатель на него:

char **pp = &p;

pp теперь хранит адрес p. Если вы хотите получить адрес pp, это будет &pp и т. Д.

1 голос
/ 13 июня 2009

Компилятор занимается преобразованием переменных в нашем коде в области памяти, используемые в машинных инструкциях. Расположение переменной-указателя зависит от того, где она объявлена ​​в коде, но программистам обычно не приходится иметь дело с этим напрямую.

Переменная, объявленная внутри функции, живет в стеке или в регистре (если не объявлена ​​как статическая).

Переменная, объявленная на верхнем уровне, находится в разделе памяти в верхней части программы.

Переменная, объявленная как часть динамически размещаемой структуры или массива, живет в куче.

Оператор «&» возвращает ячейку памяти переменной, но, в отличие от оператора «*», ее нельзя повторить.

Например, * * * i получает значение по адресу * * i, которое является значением по адресу * i, которое является значением, хранящимся в i, которое компилятор выясняет, как найти.

Но && я не буду компилировать. & i - это число, которое представляет собой область памяти, которую компилятор использует для переменной i. Этот номер нигде не хранится, поэтому && не имеет смысла.

(Обратите внимание, что если & i используется в исходном коде, то компилятор не может сохранить i в регистре.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...