猿问

为什么将char指针流传输到cout不能打印地址?

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


但是当我想使用相同的方法时cout,如何cout决定在地址和整个字符串之间应该打印什么呢?这是一个示例源:


int main()

{

  char ch='a';

  char *cptr=&ch;

  cout<<cptr<<endl;

  return 0;

}

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


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


紫衣仙女
浏览 614回答 3
3回答

MMTTMM

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

慕工程0101907

cout如果收到一个字符串,则打印一个字符串,就这么char *简单。下面是重载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 calledostream& 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*。

小唯快跑啊

我只是将其转换为void *,因此它不会尝试将其解释为C字符串:cout << (void*) cptr << endl;但是,一个更安全的选择是使用dirkgently的答案中的static_cast(这样,至少在编译时检查了强制类型转换)。
随时随地看视频慕课网APP
我要回答