[C con Clase] Dudas de arrays

Steven Davidson srd4121 en njit.edu
Lun Jun 14 05:16:03 CEST 2010


Hola Javier,

Javier Cancio del Busto wrote:
> Hola,
> 
> Siguiendo el tutorial de la web, he visto dos ejemplos que no me
> quedan muy claros... dicen:
> 
> ¿Cuantos elementos contiene cada uno de los siguientes arrays?
> 
> 1) int y[][3] = {3,6,7,2,3,1,2,4};
> 
> 2)char z[][2][10] = {"hola", "adios", "", "saludo", "chao"};
> 
> 
> No entiendo cómo se calculan los elementos en estos dos casos... :S
> 

El compilador puede inducir la cantidad de elementos porque existe una 
inicialización con los valores entre las llaves en la definición de los 
arrays.

1) 'y' es un array de X elementos, los cuales son 3 arrays de tipo 
'int'. Mirando los elementos y conociendo los tipos de cada uno, podemos 
determinar el valor de X - la cantidad de arrays.

Como cada elemento trata de 3 arrays de enteros, entonces cada grupo de 
3 enteros es un elemento. Es decir,

y[0] := {3,6,7}
y[1] := {2,3,1}
y[2] := {2,4,0}

Por lo tanto, 'y' es un array de 3 elementos, los cuales son 3 arrays de 
tipo 'int'. Conceptualmente, tenemos una tabla o matriz de 3x3 de 
enteros. Podríamos reescribir la definición de este array como:

int y[3][3] = {3,6,7,2,3,1,2,4};

Por último, recuerda que si no hay suficientes elementos en la 
inicialización para la cantidad de elementos en la variable, entonces se 
rellenan los demás con 0 (cero) del tipo adecuado. Por esta razón, 
'y[2]' contendrá el array de los tres elementos: 2, 4, y 0.

2) 'z' es un array de N elementos, los cuales son 2 arrays, cuyos 
elementos son 10 arrays de tipo 'int'. Aplicamos el mismo razonamiento 
que en 1). Ten presente que una cadena literal de caracteres se 
representa como un array de tipo 'char' con un carácter nulo al final. 
Por lo tanto, cada cadena literal es otro array.

Al final, obtenemos una matriz tridimensional de Nx2x10 de caracteres. 
Esto es:

z[0] := { "hola\0\0\0\0\0\0", "adios\0\0\0\0\0\0" }
z[1] := { "\0\0\0\0\0\0\0\0\0\0", "saludo\0\0\0\0" }
z[2] := { "ciao\0\0\0\0\0\0\0", "\0\0\0\0\0\0\0\0\0\0" }

Nuevamente, tenemos 3 elementos para la primera "dimensión".

Fíjate que las cadenas deben caber en el array de 10 'char'. Como se 
trata de una inicialización, se rellenan con ceros (de tipo 'char') los 
demás elementos para completar el array.


Espero haber aclarado la duda.

Steven




Más información sobre la lista de distribución Cconclase