2010-07-22 25 views

Respuesta

22

Con una matriz N-dimensional (N> 0), es necesario definir los tamaños de N-1 dimensiones; solo se puede dejar una dimensión para que el compilador la determine, y debe ser la primera dimensión.

Se puede escribir:

int d1[] = { ... }; 
int d2[][2] = { ... }; 
int d3[][2][3] = { ... }; 

Etc.

+1

Lamento ser el desafortunado upvote número 13, pero me pareció tremendamente útil :) –

1

Tiene que indicar al menos todas las dimensiones excepto la más grande.

es decir, en su caso

int array[][3] = { 
    {1,2,3}, 
    {4,5,6}}; 
+0

no completamente cierto, necesitas especificar todo excepto el más externo, ¿verdad? – falstro

+0

Correcto necesita las n-1 dimensiones más pequeñas. –

3

Es necesario especificar todas las dimensiones excepto en la mayor. La razón es que el compilador va a asignar un gran bloque de memoria, en oposición a una matriz de punteros que apuntan a sus propias pequeñas matrices. En otras palabras,

int array[][3][4] = ...; 

destinará una región contigua de memoria del tamaño 3 * 4 * (sin embargo muchas matrices de 3x4 se declara aquí). Así, cuando más adelante en su código, se escribe

array[1][2][3] = 69; 

con el fin de encontrar donde en la memoria para escribir 69, que comienza en la dirección (matriz), y luego salta hacia adelante 12 * sizeof (int) para llegar a la matriz [ 1], más 2 * 4 * sizeof (int) para llegar a la matriz [1] [2], más 3 * sizeof (int) para finalmente llegar al inicio de la matriz [1] [2] [3]. Compare esto con la escritura, por ejemplo,

int ***array = new int**[n]; 
for(i=0; i<n; i++) 
{ 
    array[i] = new int * [3]; 
    for(j=0; j<4; j++) 
    array[i][j] = new int[4]; 
} 

(lo siento si mi sintaxis no es exacta ... Ha pasado un tiempo desde que he tenido que codificar algo como esto en C). En este ejemplo, la matriz apunta a un bloque de código n * sizeof (int **) bytes de longitud. Cada elemento de este conjunto apunta a otra matriz de tamaño 3 * sizeof (int *) bytes de longitud. Cada elemento de estas matrices apunta a otra matriz de tamaño 4 * sizeof (int) bytes de longitud. En este caso, en lugar de calcular que la matriz [1] [2] [3] está en la dirección (matriz + algo), tendría que seguir algunos punteros diferentes en la memoria antes de encontrar dónde escribir 69.

Cuestiones relacionadas