"cout"和"char地址"

Gan*_*rey 5 c++ cout char

char p;
cout << &p;
Run Code Online (Sandbox Code Playgroud)

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

char p;
char *q;
q = &p;
cout << q;
Run Code Online (Sandbox Code Playgroud)

即使这样也没有.为什么?

And*_*röm 8

我相信<<操作员会将其识别为字符串.将它投射到void* 应该工作:

cout << (void*)&p;
Run Code Online (Sandbox Code Playgroud)

std::basic_ostream有一个专门的运算符,它取一个std::basic_streambuf(基本上一个字符串(在这种情况下)):

_Myt& operator<<(_Mysb *_Strbuf)
Run Code Online (Sandbox Code Playgroud)

而不是采用任何指针的运算符(char*当然除外):

_Myt& operator<<(const void *_Val)
Run Code Online (Sandbox Code Playgroud)


das*_*ght 6

这是因为指向的指针char有自己的 重载<<,它将指针解释为 C 字符串。

您可以通过向 中添加强制转换来修复您的代码void*,这是打印指针的重载:

char p;
cout << (void*)&p << endl;
Run Code Online (Sandbox Code Playgroud)

演示 1.

请注意,问题发生在char指针上,但不会发生在其他类型的指针上。比方说,如果你在声明中使用int而不是char,你的代码无需强制转换即可工作:

int p;
cout << &p << endl;
Run Code Online (Sandbox Code Playgroud)

演示 2.