2013-02-28 3 views
1

Je sais que si je définis un tableau commePointeurs équivalent aux tableaux

int a [10]; 

Je peux utiliser une notation de pointeur, pour y accéder son adresse à l'aide a+<corresponding_item_in_array> et il est valeur à l'aide, *(a+<corresponding_item_in_array>).

Maintenant, je voulais inverser les choses, je malloc d'allouer une mémoire à un pointeur entier, et a essayé de représenter le pointeur dans la notation de l'indice, mais cela n'a pas

int *output_array; 
output_array = (int *) (malloc(2*2*2*sizeof(int))); //i.e, space for 3d array 

output_array[0][0][1] = 25; 
//^produces error: subscripted value is neither array nor pointer 

j'ai utilisé un expression de pointeur en utilisant le mappage de stockage, mais n'est pas la méthode la plus simple disponible? et pourquoi?

+0

Vous pouvez utiliser la réponse à cet article pour étendre à la 3ème dimension aussi bien: http://stackoverflow.com/questions/1052818/create-a-pointer-to-two-dimensional-array – Tuxdude

Répondre

3

Le type int* est et non un équivalent du type de tableau 3D; il est un équivalent d'un type de tableau 1D:

int *output_array; 
output_array = (int *) (malloc(8*sizeof(int))); //i.e, space for array of 8 ints 
output_array[5] = 25; // This will work 

Le problème avec les tableaux de grades supérieurs est que pour indexer en 2D, 3D, etc. tableau le compilateur doit connaître la taille de chaque dimension à l'exception du premier afin de calculer correctement les offsets des index. Pour faire face à des tableaux 3D, définir un élément 2D, comme ceci:

typedef int element2d[2][2]; 

Maintenant, vous pouvez faire ceci:

element2d *output_array; 
output_array = (element2d*) (malloc(2*sizeof(element2d))); 
output_array[0][0][1] = 25; // This will work now 

Demo on ideone.

+0

Est-ce que 'malloc' ed, élément sur le dessus, je veux dire, output_array [malloced] [2] [2]? – cipher

+1

Incidemment, vous pouvez le faire même sans le typedef, mais la syntaxe est beaucoup plus gênante (la déclaration serait 'int (* outputArray) [2] [2];' et la distribution serait '(int (*) [ 2] [2]) '). –

+0

@cipher Correct, c'est à l'intérieur. Donc si vous faites 'malloc (200 * sizeof (element2d))' l'index le plus haut serait 'outputArray [199] [1] [1]'. – dasblinkenlight

0

Parce que le compilateur n'a pas idée de la taille de chaque dimension, de sorte qu'il ne soit pas capable de savoir où output_array[0][0][1] devrait être.

Vous pouvez essayer cette

typedef int (* array3d)[2][2]; 
array3d output_array; 
output_array = (array3d) malloc(2 * 2 * 2 * sizeof(int)); 
output_array[0][0][1] = 25; 
printf("%d\n", output_array[0][0][1]); 
0

Quel est le type de output_array? int *.

Quel est le type de *(output_array+n) ou output[n]? int.

L'indice est-il autorisé sur int? Les deux indices (par exemple *(output_array+n) et output[n]) sont des opérations de pointeur, et int n'est pas un pointeur. Ceci explique l'erreur que vous avez reçue.

Vous pouvez déclarer un pointeur vers int [x] [y] comme ceci: int (*array)[x][y];

Vous pouvez allouer de la mémoire qui est une alternative appropriée à un tableau 3D à l'aide array: array = malloc(42 * x * y);. Ce serait l'équivalent de int array[42][x][y];, sauf que les tableaux ne sont pas modifiables. Les opérateurs alignof, sizeof et address-of fonctionnent différemment et la durée de stockage est différente.