puntero char confundiendo con cout en c ++

Cuando imprimo un puntero de char con printf() , toma la decisión con el especificador de conversión si la dirección debe imprimirse o toda la cadena de acuerdo con% u o% s.

Pero cuando quiero hacer lo mismo con cout , ¿cómo decidirá qué se debe imprimir entre la dirección y toda la cadena? Aquí hay una fuente de ejemplo:

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

Aquí, en mi comstackdor GNU, cout está intentando sacar ch como una cadena.

¿Cómo puedo obtener la dirección de ch via cptr usando cout ?

La resolución de sobrecarga selecciona ostream& operator<<(ostream& o, const char *c); que se utiliza para imprimir cadenas estilo C Desea que el otro ostream& operator<<(ostream& o, const void *p); para ser seleccionado Probablemente seas mejor con un elenco aquí:

  cout << static_cast(cptr) << endl; 

cout imprime una cadena si recibe un char * , tan simple como eso.

Aquí están las sobrecargas para el 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 ); 

Si quieres la dirección, quieres:

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

entonces necesitas lanzar al const void* .

Simplemente lo lanzaría a un vacío * para que no intente interpretarlo como una cadena C:

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

Sin embargo, una opción más segura sería usar static_cast como en la respuesta de dirkgently (de ese modo, el lanzamiento se verifica al menos en tiempo de comstackción).

Como dijo Luchian, cout sabe qué imprimir según el tipo. Si desea imprimir el valor del puntero, debe convertir el puntero a void * que se interpondrá como un puntero.