cout << con l'argomento char * stampa la stringa, non il valore del puntatore

Questo:

const char * terry = "hello"; cout<<terry; 

stampa hello invece dell’indirizzo di memoria della 'h' . Perché sta succedendo?

Il motivo è che std::cout tratterà un char * come puntatore a (il primo carattere di) una stringa in stile C e la stamperà come tale. Se vuoi invece l’ indirizzo , puoi semplicemente lanciarlo su un puntatore che non viene trattato in questo modo, qualcosa come:

 cout << (void *) terry; 

(o usa il cast const void * se sei preoccupato di eliminare la costanza, qualcosa che non è un problema in questo caso particolare).


Se sei più un purista che un pragmatico, puoi anche usare il C ++ static_cast , sulla static_cast di:

 cout << static_cast  (terry); 

anche se non è necessario in questo caso particolare, il cast di un void * funzionerà correttamente. Il seguente codice di esempio mostra tutte queste opzioni in azione:

 #include  int main (void) { const char *terry = "hello"; std::cout << terry << '\n'; std::cout << (void *) terry << '\n'; std::cout << (const void *) terry << '\n'; std::cout << static_cast (terry) << '\n'; return 0; } 

output (l'indirizzo potrebbe essere diverso nel tuo ambiente):

 hello 0x8048870 0x8048870 0x8048870 

Si noti che, quando si utilizza il file static_cast , è necessario assicurarsi di non provare a scartare la costanza con static_cast (questo è ciò che const_cast è per). Questo è uno dei controlli eseguiti dai nuovi cast di C ++ e il cast vecchio stile non ha questa limitazione.

L’operatore << su std::cout è sovraccarico. Il suo comportamento dipende dal tipo di operando corretto. (In realtà sono diverse funzioni, tutti gli operator<< nome operator<< ; il compilatore decide quale chiamare).

Se gli dai un char* o const char* , tratta l'operando come puntatore a (il primo carattere di) una stringa in stile C, e stampa il contenuto di quella stringa:

 const char * terry = "hello"; cout << terry; // prints "hello" 

Se gli dai un valore char , stampa quel valore come carattere:

 cout << *terry; // prints "h" cout << terry[0]; // the same 

Se gli dai un puntatore di tipo void* , stampa quel valore del puntatore (in qualche modo definito dall'implementazione, tipicamente esadecimale):

 cout << static_cast(terry); // prints something like 0x4008e4 

Trattare un char* o const char* come puntatore a una stringa in stile C è un caso speciale e l'unico (a cui posso pensare) che fa sì che l' operator<< stampi qualcosa di diverso dal valore dell'operando. La ragione di ciò risale alle radici di C ++ in C, che non ha un tipo "stringa" e manipola le stringhe tramite i puntatori char* .

Esistono numerosi altri overload per l' operator<< , per vari tipi di numeri interi e virgola mobile, per std::string e così via.

Dovresti cambiare il tuo codice in questo modo:

 cout << static_cast(terry); 

Il problema è che l’operatore << è sovraccarico per i puntatori alle stringhe in stile C per la stampa del contenuto della stringa. Se invece lo si lancia sul puntatore raw, si avrà il comportamento predefinito di stampare il puntatore usando iostreams come si desidera.

cout è sovraccarico in modo che quando gli si assegna un carattere *, verrà stampato come puntatore a una stringa in stile C. Quindi, stampa i caratteri finché non raggiunge un carattere di terminazione nullo.

Se hai usato printf invece di cout, vedresti l’indirizzo. Puoi anche lanciare il puntatore su un altro tipo, ad esempio (void *) e otterrai anche l’indirizzo.

“ciao” è una stringa, cioè il char array. const char* è un puntatore a questo array, quindi quando si dereferenzia questo puntatore, si ottiene il valore del primo elemento.

È come se tu avessi

 int a[] = {1, 2, 3}; int *b = a; cout << *b << endl; 

ne ricevi solo 1 stampato