2010-07-22 11 views

Répondre

22

Avec un tableau à N dimensions (N> 0), vous devez définir les tailles de dimensions N-1; une seule dimension peut être laissée au compilateur pour déterminer, et elle doit être la première dimension.

Vous pouvez écrire:

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

Etc.

+1

Désolé d'être le numéro 13 malchanceux, mais j'ai trouvé cela extrêmement utile :) –

1

Vous devez indiquer au moins toutes les dimensions sauf la plus grande.

-à-dire dans votre cas

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

pas complètement vrai, vous devez spécifier tout sauf le plus à l'extérieur, non? – falstro

+0

Correct, vous avez besoin des n-1 plus petites dimensions. –

3

Vous devez spécifier toutes les dimensions, sauf la plus élevée. La raison en est que le compilateur va allouer un gros bloc de mémoire, par opposition à un tableau de pointeurs pointant vers leurs propres petits tableaux. En d'autres termes,

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

allouera une région contiguë de mémoire de taille 3 * 4 * (cependant beaucoup de tableaux 3x4 vous déclarez ici). Ainsi, lorsque plus tard dans votre code, vous écrivez

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

afin de trouver où en mémoire pour écrire 69, il commence à l'adresse (tableau), puis sauts en avant 12 * sizeof (int) pour se rendre à tableau [ 1], plus 2 * 4 * sizeof (int) pour arriver à array [1] [2], plus 3 * sizeof (int) pour enfin arriver au début du tableau [1] [2] [3]. Comparez cela à l'écriture, par exemple,

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]; 
} 

(désolé si ma syntaxe est pas exactement ... un moment que j'ai dû code quelque chose comme ça dans C). Dans cet exemple, le tableau pointe vers un bloc de code n * sizeof (int **) octets long. Chaque élément de ce tableau pointe vers un autre tableau de taille 3 * sizeof (int *) octets long. Chaque élément de ces tableaux pointe vers un autre tableau de taille 4 * sizeof (int) octets long. Dans ce cas, au lieu de calculer ce tableau [1] [2] [3] est à l'adresse (tableau + quelque chose), il faudrait suivre quelques pointeurs différents en mémoire avant de trouver où écrire 69.

Questions connexes