Если вы хотите напечатать адрес, вы должны привести char*
к void*
, как
const char *str = "how are you\n";
cout << (void*) str << endl;
В отсутствие приведения cout
видит str
как const char*
(что на самом деле так и есть), и поэтому cout
думает, что вы собираетесь печатать строку символов с нулевым символом в конце!
Подумайте: если вы хотите, чтобы coud << str
напечатал адрес, как бы вы напечатали саму строку?
-
В любом случае вот более подробное объяснение:
operator<<
перегружен для char*
, а также void*
:
//first overload : free standing function
basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>& _Ostr, const char *_Val);
//second overload : a member of basic_ostream<>
_Myt& operator<<(const void *_Val);
В отсутствие приведения вызывается первая перегрузка, но когда вы приводите к void*
, вызывается вторая перегрузка!