Perché cout print array di caratteri in modo diverso dagli altri array?

Sto usando C ++ per capire come funzionano esattamente i puntatori. Ho questo pezzo di codice usando gli array, che sto usando solo per capire come l’equivalente funzioni con i puntatori.

int main() { int arr[10] = {1,2,3}; char arr2[10] = {'c','i','a','o','\0'}; cout << arr << endl; cout << arr2 << endl; } 

Tuttavia, quando lo arr , arr emette l’indirizzo del primo elemento dell’array di ints (come previsto) ma arr2 non restituisce l’indirizzo del primo elemento dell’array di caratteri; stampa effettivamente “ciao”.

Cosa mi manca o che non ho ancora imparato a riguardo?

È l’operatore < < che è sovraccarico per const void* e per const char* . Il tuo array di caratteri viene convertito in const char* e passato a quel sovraccarico, perché si adatta meglio di const void* . L’array int, tuttavia, viene convertito in const void* e passato a quella versione. La versione dell’operatore < < taking const void* restituisce solo l’indirizzo. La versione che utilizza const char* considera come una stringa C e restituisce ogni carattere fino al carattere null che termina. Se non lo desideri, converti il ​​tuo array di caratteri in const void* esplicito quando lo passi all’operatore < <:

 cout < < static_cast(arr2) < < endl; 

Poiché l’ operator < < di cout operator < < è sovraccarico per char* per produrre stringhe e arr2 corrisponde a questo.

Se si desidera l'indirizzo, provare a trasmettere l'array di caratteri come puntatore vuoto.

Esiste un sovraccarico standard per char * che emette una stringa terminata NUL.

Mentre il casting è probabilmente un approccio più significativo, puoi anche utilizzare l’indirizzo dell’operatore:

 cout < < &arr2 << endl;