Ваше неправильное понимание заключается в том, что есть s
. Это не указатель: это массив.
Теперь в большинстве контекстов s
вычисляет указатель на первый элемент массива: эквивалентно &s[0]
, указатель на этот 'H'
. Здесь важно то, что значение указателя, которое вы получаете при оценке s
, является временным, эфемерным значением - так же, как &s[0]
.
Поскольку этот указатель не является постоянным объектом (на самом деле он не хранится в s
), вы не можете указать на него указатель-указатель. Чтобы использовать указатель на указатель, у вас должен быть реальный объект-указатель, на который можно указать - например, все в порядке:
char *p = s;
char **p2 = &p;
Если вы оцениваете *p2
, вы говорите компилятору загрузить то, на что указывает p2
, и обращаться с ним как с указателем на символ. Это нормально, когда p2
действительно указывает на указатель на символ; но когда вы делаете char **p2 = &s;
, то, на что указывает p2
, вовсе не является указателем - это массив (в данном случае это блок из 13 char
с).