“cout”和“char地址”

时间:2015-03-21 22:12:59

标签: c++ char cout

char p;
cout << &p;

这不会打印字符p的地址。它打印一些字符。为什么呢?

char p;
char *q;
q = &p;
cout << q;

即使这样也没有。为什么呢?

3 个答案:

答案 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;

Demo 1.

请注意,问题发生在char指针上,但不适用于其他类型的指针。比如,如果您在声明中使用int而不是char,那么您的代码可以在没有演员的情况下使用:

int p;
cout << &p << endl;

Demo 2.

答案 2 :(得分:2)

std::cout会将char*视为字符串。您基本上是在未初始化指针的位置看到内存中包含的内容 - 直到遇到终止空字符。如果需要查看指针,则将指针转换为void *应该打印实际的指针值