Если ** L представляет адрес переменной L, не может ли он быть заменен на & L вместо этого?
**L
представляет значение в местоположении, на которое указывает местоположениена что указывает L
.Для иллюстрации предположим следующие объявления:
int a = 1;
int * pa = & a; // whitespace doesn't matter here
int **ppa = &pa;
ppa
указывает на pa
, что в свою очередь указывает на a
, который имеет значение 1
.Вот гипотетическая карта памяти, показывающая их отношения (предположим, 32-разрядные целые числа с прямым порядком байтов):
Object Address 0x00 0x01 0x02 0x03
------ ------- ----------------------
a 0x10008000 0x00 0x00 0x00 0x01
pa 0x10008004 0x10 0x00 0x80 0x00
ppa 0x10008008 0x10 0x00 0x80 0x04
В объявителе оператор *
указывает, что эта переменная указатель и содержит адрес другой переменной.В выражении оператор *
возвращает значение, на которое указывает указатель.В деклараторе C ++ оператор &
указывает, что эта переменная является ссылкой и является синонимом для другой переменной (котораяне обязательно то же самое, что указатель; C не разрешает &
в деклараторе).В выражении оператор &
возвращает адрес своего операнда.
Итак, исходя из карты памяти, приведенной выше, все следующее верно:
a == 1;
* pa == 1; // again, whitespace doesn't matter here.
**ppa == 1;
&a == 0x10008000;
pa == 0x10008000;
*ppa == 0x10008000;
&pa == 0x10008004;
ppa == 0x10008004;
&ppa == 0x10008008;