Переменной указателя также назначен адрес памяти? - PullRequest
3 голосов
/ 01 декабря 2008

В C ++ в стеке простой переменной назначается адрес памяти, так что мы можем использовать указатель для хранения этой памяти, чтобы указывать на нее; тогда указателю также назначается адрес памяти?

Если да, можем ли мы иметь указатель указателей?

Ответы [ 3 ]

15 голосов
/ 01 декабря 2008

Да, вы правы. У нас могут быть указатели на указатели:

int a;
int b;
int * pa = &a;
int ** ppa = &pa;

// set a to 10
**ppa = 10;

// set pa so it points to b. and then set b to 11.
*ppa = &b;
**ppa = 11;

Прочтите это справа налево: ppa - указатель на указатель на int . Это не ограничено **. Вы можете иметь столько уровней, сколько захотите. int *** будет указателем на указатель на указатель на int .

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

12 голосов
/ 01 декабря 2008

Да, у вас могут быть указатели на указатели (или указатели на указатели на указатели), и да, при необходимости указатели также сохраняются по адресу в памяти.

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

2 голосов
/ 01 декабря 2008

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

...