"cout"和"char address"
"cout" and "char address"
char p;
cout << &p;
这不会打印字符 p 的地址。它打印一些字符。为什么?
char p;
char *q;
q = &p;
cout << q;
即使这样也没有。为什么?
我相信<<
运算符将其识别为字符串。将其转换为void*
应该有效:
cout << (void*)&p;
std::basic_ostream
有一个专门的运算符,它接受一个std::basic_streambuf
(基本上是一个字符串(在本例中((:
_Myt& operator<<(_Mysb *_Strbuf)
与接受任何指针的运算符相反(当然char*
除外(:
_Myt& operator<<(const void *_Val)
这是因为指向char
的指针有自己的重载<<
,它将指针解释为C字符串。
您可以通过向 void*
添加强制转换来修复代码,这是打印指针的重载:
char p;
cout << (void*)&p << endl;
演示 1.
请注意,char
指针出现问题,但其他类型的指针不会出现问题。比如说,如果你在声明中使用int
而不是char
,你的代码可以在没有强制转换的情况下工作:
int p;
cout << &p << endl;
演示 2.
std::cout
会将char*
视为字符串。您基本上在未初始化指针的位置看到内存中包含的任何内容 - 直到遇到终止的空字符。如果需要查看指针,将指针转换为 void* 应打印实际指针值