2

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

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

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

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

如何ch通过cptrusing获取地址cout

4

4 回答 4

15

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

 cout << static_cast<void *>(cptr) << endl;
于 2012-06-03T10:17:32.647 回答
7

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

以下是 for 的operator <<重载ostream

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*.

于 2012-06-03T10:16:40.573 回答
4

我只是将它转换为 void* 所以它不会尝试将其解释为 C 字符串:

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

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

于 2012-06-03T10:17:16.843 回答
0

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

于 2012-06-03T10:18:20.977 回答