为什么将字符指针流式传输到 cout 不打印地址

Why does streaming a char pointer to cout not print an address?

本文关键字:cout 打印 地址 传输 字符 指针 为什么      更新时间:2023-10-16

>当我打印带有printf()的字符指针时,它会根据 %u 或 %s 使用转换说明符来决定是应该打印地址还是整个字符串。

但是当我想对cout做同样的事情时,cout将如何决定应该在地址和整个字符串之间打印什么?下面是一个示例源:

int main()
{
  char ch='a';
  char *cptr=&ch;
  cout<<cptr<<endl;
  return 0;
}

在这里,在我的 GNU 编译器中,cout 正在尝试将 ch 输出为字符串。

如何使用cout通过cptr获取ch地址?

重载分辨率选择用于打印 C 样式字符串的ostream& operator<<(ostream& o, const char *c);。您希望选择其他ostream& operator<<(ostream& o, const void *p);。你可能最好在这里有一个演员表:

 cout << static_cast<void *>(cptr) << endl;
cout如果

收到char *,则打印一个字符串,就这么简单。

以下是ostream operator <<重载:

ostream& operator<< (bool val);
ostream& operator<< (short val);
ostream& operator<< (unsigned short val);
ostream& operator<< (int val);
ostream& operator<< (unsigned int val);
ostream& operator<< (long val);
ostream& operator<< (unsigned long val);
ostream& operator<< (float val);
ostream& operator<< (double val);
ostream& operator<< (long double val);
ostream& operator<< (const void* val);
ostream& operator<< (streambuf* sb);
ostream& operator<< (ostream& ( *pf )(ostream&));
ostream& operator<< (ios& ( *pf )(ios&));
ostream& operator<< (ios_base& ( *pf )(ios_base&));
ostream& operator<< (ostream& out, char c );
ostream& operator<< (ostream& out, signed char c );
ostream& operator<< (ostream& out, unsigned char c );

//this is called
ostream& operator<< (ostream& out, const char* s );
ostream& operator<< (ostream& out, const signed char* s );
ostream& operator<< (ostream& out, const unsigned char* s );

如果需要地址,则需要:

ostream& operator<< (const void* val);

所以你需要投射到const void*.

我只是把它投射到一个空白*,这样它就不会试图将其解释为 C 字符串:

cout << (void*) cptr << endl;

但是,更安全的选择是使用 dirkgently 答案中的static_cast(这样至少在编译时检查了强制转换)。

正如Luchian所说,cout知道根据类型打印什么。如果要打印指针值,则应将指针转换为 void*,该指针将作为指针插入。