char []
denota el tipo "array de desconocido unido de char", mientras que char *
denota el tipo " puntero a char ". Como ha observado, cuando una definición de una variable de tipo "array of unknown bound of char" se inicializa con una cadena literal, el tipo se convierte en "array [N] of char" donde N tiene el tamaño apropiado. Lo mismo se aplica en general a la inicialización de la matriz agregada:
int arr[] = { 0, 1, 2 };
arr se convierte en el tipo "array [3] de int".
En una definición de tipo definido por el usuario (struct
, class
o union
), array-de-desconocido unido tipos están prohibidos en C++, aunque en algunas versiones de C que se les permite que el última miembro de un struct , donde se pueden usar para acceder a la memoria asignada más allá del final de la estructura; este uso se llama "arreglos flexibles".
La construcción de tipo recursivo es otra diferencia; uno puede construir punteros y matrices de char *
(por ejemplo, char **
, char (*)[10]
), pero esto es ilegal para matrices de límite desconocido; uno no puede escribir char []*
o char [][10]
(aunque char (*)[]
y char [10][]
están bien).
Finalmente, la calificación de cv funciona de manera diferente; dado typedef char *ptr_to_char
y typedef char array_of_unknown_bound_of_char[]
, cv-qualifiying la versión del puntero se comportará como se esperaba, mientras que cv-qualifying la versión del array migrará la cv-qualification al tipo de elemento: es decir const array_of_unknown_bound_of_char
es equivalente a const char []
y no el char (const) []
ficticio. Esto significa que en una definición de función, donde la descomposición de matriz a la aguja opera en los argumentos antes de construir el prototipo,
void foo (int const a[]) {
a = 0;
}
es legal; no hay forma de que el parámetro array-of-unknown-bound no sea modificable.
Aunque el título es exactamente el mismo, esta pregunta es en realidad mucho más informativa. ¡Deberíamos volver a abrirlo! – ltjax
@ltjax Y tienes razón. Mi culpa por ser gatillo feliz. Votado volver a abrir. – Mysticial
'' char * c = "test"; '' es un código no estándar. El correcto es '' const char * c = "test"; '' –