/ / Différence entre les tableaux multidimensionnels et les tableaux de pointeurs - c, tableaux

Différence entre tableaux multidimensionnels et tableau de pointeurs - c, tableaux

J'ai toujours cru qu'en C:

int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

fait référence à un tableau de tableaux et en mémoire quinze blocs contigus sont stockés mais a[0] est le pointeur vers a[0][0] et a[1] est le pointeur vers a[1][0] etc. J'ai donc pensé qu'il serait similaire à un tableau de pointeurs. Quelle est la différence entre eux?

Réponses:

2 pour la réponse № 1

Les tableaux et les pointeurs ont un aspect très curieux etrelation intime en C (et C ++). Dans la plupart des contextes, si vous avez quelque chose qui est un "tableau de X", il sera converti en silence en un "pointeur vers X" qui pointe vers le premier élément du tableau.

Votre conviction que

int a[5][3];

crée un tableau de tableaux est tout à fait correct. Selon la déclaration, il s'agit d'un array of 5 arrays of 3 ints et il occupe 15 entiers contigus en mémoire.

Où vous vous trompez, c'est en croyant a[0] être un pointeur. En réalité, a[0] est le premier sous-tableau de a et est lui-même un array of 3 ints. Cependant, en raison de la curieuse relation entre les pointeurs et les tableaux, l'expression a[0] est presque toujours converti en pointeur.

L'une des principales différences entre un ensemble detableaux et un tableau de pointeurs se trouve dans où résident les éléments du tableau. Un tableau de tableaux occupera toujours un bloc de mémoire contigu, mais les pointeurs d'un tableau de pointeurs feront chacun référence à leurs propres blocs de mémoire (souvent disjoints).


0 pour la réponse № 2

Les tableaux et les pointeurs correspondent de manière lâche à la même chosechose. Lorsque vous déclarez un tableau N long, vous allouez un bloc de mémoire N long (multiplié par la taille du type de valeur) et renvoyez le pointeur au premier élément. Des expressions comme arr[2] puis récupérez une valeur de cette mémoire en comptant vers l'avant à partir de ce premier pointeur. Si vous avez un tableau de tableaux, alors tout ce que vous stockez dans le premier (dans votre a tableau) est un pointeur vers l'emplacement de stockage des autres tableaux. (Cela dit, je pense qu'ils devraient être dans un bloc contigu comme vous l'avez dit)

Est-ce que cela aide quelque peu l'explication?


0 pour la réponse № 3
 int a[5][3]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

Il s'agit d'un véritable tableau à deux dimensions: 15 int des emplacements de taille ont été mis de côté et l'indice rectangulaire classique est utilisé pour trouver l'élément a[row][col]

int *b[5];

Ceci est un tableau de pointeurs qui alloue 5 pointeurs et n'est pas initialisé mais a[3][2] et b[3][2] sont tous deux des références syntaxiquement légales à un seul int.

En supposant que chaque élément de b Est-ce que pointer vers un tableau à trois éléments, il y aura alors 15 ints mis de côté, plus cinq cellules pour la pointeurs.

L'avantage important du tableau de pointeurs est que les lignes du tableau peuvent être de différentes longueurs. Autrement dit, chaque élément de b pas besoin de pointer vers un vecteur à trois éléments, certains peut indiquer deux éléments, certains à neuf et certains à aucun.