Comment fonctionnent les tableaux multidimensionnels en C ++?

Dupliquer possible:
Comment utiliser des tableaux en C ++?

Pour le dire simplement, un tableau multidimensionnel en C ++ est-il un tableau de tableaux ou s’agit-il simplement d’un tableau unique qui se comporte comme s’il était multidimensionnel?

Un de mes amis a expliqué que les tableaux en C ++ sont simplement des pointeurs constants et que les tableaux multidimensionnels sont également des pointeurs constants dont les éléments sont adressés par plusieurs index (c’est-à-dire qu’ils sont des pointeurs pointant vers un grand tableau et que le décalage des éléments est calculé). en utilisant plusieurs indices).

Je crois que les tableaux multidimensionnels sont des tableaux unidimensionnels de pointeurs qui pointent vers d’autres tableaux, car lors du passage de tableaux multidimensionnels en tant qu’arguments de fonction, j’utilise souvent la syntaxe:

void copy_masortingx(int ** masortingx); 

Sinon, est-il possible de créer un tableau de tableaux en C ++ et d’affecter la valeur de chaque sous-tableau au moment de la compilation, ce qui équivaut à la sémantique des instructions suivantes:

 int line[2][2]; line[0] = {100, 100}; line[1] = {200, 200}; 

Les instructions ci-dessus génèrent une erreur de temps de compilation. Un rapide bidouillage (non testé) que j’ai trouvé était:

 int line[2][2]; void assign(int index, int * point, int length) { for (int i = 0; i < length; i++) { line[index][i] = point[i]; } } assign(0, {100, 100}, 2); assign(1, {200, 200}, 2); 

Cependant, je pense qu’il doit exister un moyen plus élégant d’atteindre le même résultat. J’espère bien comprendre ces concepts et toute consortingbution sera appréciée.

L’initialiseur de liste d’accolade ne fonctionne que pendant l’ initialisation et ne peut pas être utilisé pour une affectation, car vous semblez tenter.

Au lieu de cela, il suffit d’initialiser le tableau multidimensionnel en une seule fois:

 int line[2][2] = { {100, 100}, {200, 200} }; 

En réponse à votre première phrase: Les tableaux sont des tableaux et les pointeurs sont des pointeurs et ils ne sont pas la même chose. Cependant, un tableau se décompose facilement en un pointeur vers le premier élément, et x[n] est équivalent à *(x + n) . Ceci s’applique également aux tableaux multidimensionnels de manière récursive.

Les tableaux T[N] sont contigus en mémoire pour T et sizeof(T[N]) == N * sizeof(T) ; par conséquent, les tableaux de tableaux T[N][M] sont contigus à la fois pour T[N] et pour T

Les tableaux multidimensionnels en C et C ++ sont des tableaux de tableaux. Mais comme un tableau dispose simplement ses objects en mémoire les uns après les autres, un tableau de tableaux ne fait que dresser les tableaux les uns après les autres. Vous pouvez donc le traiter comme un tableau unique si vous le décomposez en un pointeur.

Vous initialisez un tableau en plaçant ses valeurs entre des accolades, délimitées par des virgules. Vous initialisez un tableau de tableaux de la même manière – en plaçant ses valeurs (elles-mêmes des tableaux) entre accolades.

Alors:

  int line[2][2]={ { 100, 100 }, // line[0] { 200, 200 } // line[1] }; 

Cependant, il n’y a pas de raccourci pour l’affectation. Vous devez le faire membre par membre (ou utiliser une fonction telle que memcpy ).

Cela fait longtemps que je n’ai pas codé quelque chose en C ++ (plus d’un Java maintenant), mais si je me souviens bien, les tableaux multidimensionnels sont en fait des tableaux de tableaux.

Et vous pouvez initialiser le tableau de cette façon: int line [2] [2] = {{100, 100}, {200, 200}};

PS: les freins carrés ne sont qu’une simplification: un [x] est identique à * (a + x) et un [x] [y] est identique à * (* (a + x) + y)

PPS: initialisation légèrement corrigée

Pour le dire simplement, un tableau multidimensionnel en C ++ est-il un tableau de tableaux ou s’agit-il simplement d’un tableau unique qui se comporte comme s’il était multidimensionnel?

C’est le dernier. Il existe une différence énorme à la fois dans la représentation de la mémoire et dans la façon dont les indices sont interprétés entre des tableaux multidimensionnels et déchiquetés.

Un tableau multidimensionnel tel que int array[L][M][N] occupe un bloc de mémoire contigu. Accéder à un élément individuel array[i][j][k] équivaut à *(&array[0][0][0]+(i*M+j)*N+k) . La recherche implique un seul déréférencement de pointeur.

Un tableau irrégulier tel que int *** ragged est un tableau unidimensionnel de pointeurs int** . Chacun de ces pointeurs int** est un tableau unidimensionnel de pointeurs int* , et chacun de ces points est un tableau unidimensionnel d’ints. Ici, le array[i][j][k] est équivalent à *(*(*(array+i)+j)+k) . La recherche implique trois déréférences de pointeur.