В этом выражении
printf("%p %s\n", &ch , ch);
выводится адрес переменной ch с автоматическими c продолжительностью хранения, объявленной как
char ch[] = "Hello World!";
В этом выражении
printf("%p %s\n", p1, p1);
выводится значение, хранящееся в указателе p1
, которое является адресом первого символа строкового литерала "Hello World!" который хранится в памяти stati c (память с продолжительностью хранения stati c).
Таким образом, вы выводите адреса различных типов памяти.
Во втором случае Значение адреса меньше, чем в первом случае. Начальные нули не выводятся, хотя оба указателя имеют одинаковый размер 8 байтов.