问题
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