В вашем фрагменте кода есть три переменные. Вот таблица, показывающая значение, которое каждая переменная будет иметь после выполнения каждой из строк (если код должен был на самом деле компилироваться).
| x | p_int | p_p_int |
-------------------------+----+-------+---------|
int x = 0; | 0 | undef | undef |
int *p_int = & x; | 0 | &x | undef |
int **p_p_int = & p_int; | 0 | &x | &p_int | <-- begin: all variables lead to x
-------------------------+----+-------+---------|
*p_int = 12; | 12 | &x | &p_int |
**p_p_int = 25; | 25 | &x | &p_int |
-------------------------+----+-------+---------| <-- end: all variables lead to x
p_int = 12; | 25 | 12 | &p_int | <-- p_int now points to garbage
*p_p_int = 3; | 25 | 3 | &p_int |
-------------------------+----+-------+---------|
p_p_int = 27; | 25 | 3 | 27 | <-- p_p_int now points to garbage
------------------------------------------------/
Я использовал undef
, чтобы указать, что переменная еще не существует (т.е. не определено); &x
и &p_int
для представления адресов этих переменных (поскольку точное значение неизвестно).
Это упражнение на мысль, чтобы понять, понимаете ли вы различные уровни косвенности, если понимаете, что *p_int
и p_int
относятся к разным значениям в памяти. Как вы заметили, он не компилируется. Назначение литерального числового значения c для указателя почти наверняка является ошибкой, бесполезной вне такого мысленного эксперимента. В реальном коде строка типа p_int = 12
, вероятно, является опечаткой (вероятно, она должна быть *p_int = 12
), и компилятор предупредит вас об этом.
К счастью, автор, кажется, знает о нецелесообразности пытаясь получить доступ к памяти по адресам 12
, 3
и 27
, поскольку ни p_int
, ни p_p_int
не были отменены при сохранении поддельного адреса. Тем не менее, было бы неплохо, если бы автор признал эти ограничения или еще лучше разработал упражнение, в котором такой отказ от ответственности не требуется. (Надеюсь, это был отдельный отрывок. В отличие от некоторых людей, я бы не стал осуждать целую книгу на основе одного упражнения. Книги длинные, С ++ сложный, и ошибки случаются . )