Why does streaming a char pointer to cout not print an address?

南笙酒味 提交于 2019-11-26 04:01:24

问题


When I print a char pointer with printf(), it makes the decision with conversion specifier whether the address should be printed or the whole string according to %u or %s.

But when I want to do the same thing with cout, how will cout decide what should be printed among address and whole string? Here is an example source:

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

Here, in my GNU compiler, cout is trying to output ch as a string.

How I can get address of ch via cptr using cout?


回答1:


Overload resolution selects the ostream& operator<<(ostream& o, const char *c); which is used for printing C-style strings. You want the other ostream& operator<<(ostream& o, const void *p); to be selected. You are probably best off with a cast here:

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



回答2:


cout prints a string if it receives a char *, simple as that.

Here are the overloads for operator << for 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 );

If you want the address, you want:

ostream& operator<< (const void* val);

so you need to cast to const void*.




回答3:


I would just cast it to a void* so it doesn't try to interpret it as a C-string:

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

However, a safer option would be to use static_cast as in dirkgently's answer (that way the cast is at least checked at compile time).




回答4:


As Luchian said, cout knows what to print based on the type. If you want to print the pointer value, you should cast the pointer to void* which will be interpated as a pointer.



来源:https://stackoverflow.com/questions/10869459/why-does-streaming-a-char-pointer-to-cout-not-print-an-address

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!