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