为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

C++
紫衣仙女 2019-12-06 15:47:08

当我使用来打印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?


查看完整描述

3 回答

?
MMTTMM

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


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


查看完整回答
反对 回复 2019-12-06
?
慕工程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 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*。


查看完整回答
反对 回复 2019-12-06
?
慕标5265247

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


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

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


查看完整回答
反对 回复 2019-12-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信