Это потому, что operator<<
имеет специальную функциональность для обработки указателей символов, так как они являются строками в устаревшем C. Таким образом, предполагается, что любой char *
, который вы ему дадите, является указателем на первый символ в устаревшей строке C, и выведитеэто как таковое.
Если вы хотите специально обработать его как указатель, приведите его к типу указателя без специальной обработки, что-то вроде:
cout << static_cast<void *>(s);