"cout"和"char address"

"cout" and "char address"

本文关键字:address char cout      更新时间:2023-10-16
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* 应打印实际指针值