Я думаю, что проблема здесь: даже
const char * const p = "hello";
определяют только переменную-указатель, в которой хранится адрес памяти, значениепамять не может быть определена при компиляции.но
const char pp [] = "hello";
компилятор будет знать, когда компилируется память "hello", а не указатель куда-то еще.поэтому
printf ("p =% p, & p =% p \ n", p, p);
получит то же значение.но
printf ("pp =% p, & pp =% p \ n", pp, & pp);
не покажет одно и то же значение.