p[0]
это не указатель, это char
.
Поскольку вы запрашиваете %p
в строке формата, он принудительно приводится к неверному указателю со значением 0x00000066
, которое является просто значением ASCII f
, первого символа в строке.
Если вы включите все предупреждения, которые предлагает ваш компилятор, вы можете увидеть предупреждение, которое подчеркивает это преобразование и его потенциальную ошибку.
p
относится к типу char*
. &p[0]
похоже на &(*(p + 0))
, то есть вы отменяете ссылку на char
, а затем превращаете его обратно в указатель с помощью &
. Конечный результат такой же, как и в оригинале.