Это потому, что вы разыменовываете неинициализированные указатели. Это неопределенное поведение.
Одна из перегрузок оператора <<
в стандартной библиотеке C ++ интерпретирует char*
как строку C, а не как указатель. Если ваша строка C не инициализирована, оператор <<
печатает ненужные файлы. Для int*
подобной перегрузки не существует, которая интерпретировала бы ее как что-либо, кроме указателя, поэтому во втором случае вы видите правильное поведение.
Если вы не хотите, чтобы указатель char*
интерпретировался как строка C, приведите указатель к void*
.
cout << hex << static_cast<void*>(pa) << endl;
(hex
позволяет отображать указатель с использованием более обычной записи base-16).