当我用printf()
打印一个字符指针时,它会根据转换说明符决定是应该打印地址还是根据%u或%s打印整个字符串。
但是当我想用cout
做同样的事情时,cout
将如何决定在地址和整个字符串中应该打印什么?以下是一个示例来源:
int main()
{
char ch='a';
char *cptr=&ch;
cout<<cptr<<endl;
return 0;
}
这里,在我的GNU编译器中,cout
试图将ch输出为字符串。
如何使用ch
通过cptr
获取cout
的地址?
答案 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 *,它将作为指针插入。