¿Por qué Cout imprime matrices de caracteres de manera diferente a otras matrices?

Estoy usando C ++ para entender cómo funcionan exactamente los punteros. Tengo este código usando matrices, que estoy usando solo para entender cómo funciona el equivalente con los punteros.

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

Sin embargo, cuando ejecuto esto, arr emite la dirección del primer elemento de la matriz de ints (como se esperaba), pero arr2 no arr2 la dirección del primer elemento de la matriz de caracteres; en realidad imprime “ciao”.

¿Qué es lo que me estoy perdiendo o que aún no he aprendido sobre esto?

Es el operador < < que está sobrecargado para const void* y para const char* . Su matriz char se convierte en const char* y se pasa a esa sobrecarga, porque encaja mejor que const void* . Sin embargo, la matriz int se convierte en const void* y se pasa a esa versión. La versión del operador < < tomando const void* simplemente emite la dirección. La versión que toma el const char* realidad lo trata como una C-cadena y emite cada carácter hasta el carácter nulo de terminación. Si no quiere eso, convierta su matriz de caracteres a const void* explícitamente cuando la pase al operador < <:

 cout < < static_cast(arr2) < < endl; 

Porque el operator < < cout está sobrecargado de char* para cadenas de salida, y arr2 coincide con eso.

Si desea la dirección, intente convertir la matriz de caracteres en un puntero vacío.

Hay una sobrecarga estándar para char * que genera una secuencia terminada en NUL.

Mientras que el casting es probablemente un enfoque más significativo, también puede usar el operador addressof:

 cout < < &arr2 << endl;