2012-04-21 31 views
5
char arr[3]; 
arr="hi";// ERROR 
cin>>arr;// and at runtime I type hi, which works fine. 

1) ¿alguien me puede explicar por qué?asignar una matriz de caracteres a una cadena literal - C++

2) y cuál es exactamente el tipo de "hola", sé que se llama cadena literal. pero, ¿es solo una serie de caracteres también?

3) is not cin >> arr; será como asignarle arr a lo que escribe en el tiempo de ejecución?

Respuesta

6

Las matrices en C++ no son tipos reales, solo una representación estructurada de una serie de valores, y no punteros si lo encuentra en cualquier lugar (se degradan en punteros). No puede usarlos como usaría otros tipos, incluida la asignación. La elección fue agregar mucho soporte para matrices o mantenerlas de la manera más simple y rápida posible. Se eligió este último, que es una de las distinciones que C++ tiene de algunos otros idiomas.

Para copiar una matriz, copie cada elemento de a uno por vez.

En C++ 11, hay un contenedor STL std::array. Fue diseñado para encajar como un conjunto simple con sobrecarga del operador, así como también relacionado con el resto del STL.

Una mejor alternativa es std::string. Incorpora el comportamiento que desea y más, y está específicamente diseñado para contener matrices de caracteres.

"hola" es, como señala Konrad Rudolph, un const char [3].

En cuanto a cin en una matriz en bruto, no es posible de forma estándar porque no hay sobrecarga para cin con arreglos. Sin embargo, es posible crear su propia sobrecarga. Sin embargo, no estoy seguro de cómo representaría los diferentes tamaños de matrices que pasan, a menos que lo defina para un contenedor que conozca su tamaño en lugar de un conjunto sin formato.

+0

Una alternativa aún mejor es 'std :: string'. – Cornstalks

+0

Vaya, sí se me olvidó que era una serie de personajes^_^ – chris

+0

bueno, gracias. Pero realmente no estoy buscando lo mejor. Solo estoy tratando de entender estos conceptos. Sé que en realidad la programación no usaría esta cadena de estilo C. –

6

Si desea, se puede declarar:

char array[] = "hi!"; 

crea una matriz y 'inicializa' a 4 bytes de longitud, "Hola!"

char const *array2 = "hey!"; 

Crea un puntero a memoria de sólo lectura, una cadena literal

array2 = array; 

Ahora puede utilizar el puntero matriz2 acceder a la matriz de una. Esto se llama desintegración del puntero; array y array2 no son del mismo tipo, aunque pueden cooperar aquí. Una matriz de tipo char "se descompone" en un apuntador-a de tipo char.

array = array2; // ERROR 

Una matriz no es un puntero. Estás pensando que una matriz es un puntero, cuando en realidad está preasignada. Está intentando asignar una dirección, pero la matriz [] ya tiene una "codificada" cuando se creó, y no se puede cambiar.

Cuestiones relacionadas