2009-02-01 23 views
13

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.¿Por qué Cout imprime matrices de caracteres de forma diferente a otras matrices?

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 funciono esto, arr emite la dirección del primer elemento de la matriz de enteros (como se esperaba) pero arr2 no salida de la dirección del primer elemento de la matriz de caracteres; en realidad imprime "ciao".

¿Qué es lo que me falta o que no he aprendido todavía sobre esto?

Respuesta

28

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

cout << static_cast<const void*>(arr2) << endl; 
+1

De acuerdo con [este] (http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/) solo está sobrecargado para void *. ¿Significa eso que es capaz de determinar si el puntero apunta a los caracteres, y si es así, busca el carácter del terminal e imprime la cadena? (Todavía un poco perplejo) – rmp251

+3

@ rmp251: Perdido [estos] (http://www.cplusplus.com/reference/ostream/ostream/operator-free/)? –

0

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

4

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

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

0

Mientras casting es probablemente un enfoque más productivo, también se puede utilizar el operador AddressOf:

cout << &arr2 << endl; 
+0

Probablemente quiera '& arr2 [0]' en lugar de '& arr2' aquí –

+0

Esas son las mismas direcciones, Shawley. –

+0

Una matriz en C/C++ es solo una serie de ubicaciones de memoria. Entonces, la dirección de la matriz es la dirección del primer elemento. Me pregunto por qué esto fue rechazado – Mystic

Cuestiones relacionadas