为什么流式传输cout的指针不能打印地址?

时间:2012-06-03 10:13:05

标签: c++ string pointers char cout

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

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

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

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

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

4 个答案:

答案 0 :(得分:14)

重载分辨率选择用于打印C风格字符串的ostream& operator<<(ostream& o, const char *c);。您希望选择其他ostream& operator<<(ostream& o, const void *p);。你最喜欢这里的演员:

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

答案 1 :(得分:7)

cout如果收到char *就打印一个字符串,就像那样简单。

以下是operator <<的{​​{1}}重载:

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);

答案 2 :(得分:4)

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

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

但是,一个更安全的选择是使用static_cast作为dirkgently的答案(这样就可以在编译时检查强制转换)。

答案 3 :(得分:0)

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