3 votes

Comment obtenir une colonne d'un tableau multidimensionnel en C/C++?

int matrix[9][9],*p;
p=matrix[0]; 

cela fonctionne et donne la première ligne de la matrix, mais comment obtenir la première colonne de la matrix J'ai essayé p=matrix[][0]; ? De plus, je ne comprends pas pourquoi le code ci-dessous obtient une erreur de compilation ?

int matrix[9][9],p[9];  // ça a l'air vraiment moche, mais pourquoi ça ne marche pas ?
p=matrix[0];            // le compilateur donne "affectation de tableau invalide"

est-ce que c'est parce que les tableaux multidimensionnels sont des tableaux de tableaux - et nous devrions interpréter matrix[i][j] comme le j-ème élément du i-ème tableau imbriqué ?

16voto

meyumer Points 2203

En C/C++, les tableaux multidimensionnels sont en réalité stockés sous forme de tableaux unidimensionnels (en mémoire). Votre matrice 2D est stockée sous forme de tableau unidimensionnel avec un ordre de rangée d'abord. C'est pourquoi obtenir une colonne de la matrice n'est pas facile et n'est pas fourni par défaut. Il n'y a pas de tableau contigu en mémoire auquel vous pouvez obtenir un pointeur qui représente une colonne d'un tableau multidimensionnel. Voir ci-dessous:

Lorsque vous faites p=matrix[0], vous obtenez simplement le pointeur vers le premier élément matrix[0][0], et cela vous fait penser que vous avez obtenu le pointeur vers la première ligne. En réalité, c'est un pointeur vers l'ensemble du tableau contigu qui contient matrix, comme suit:

matrix[0][0]
matrix[0][1]
matrix[0][2]
.
.
matrix[1][0]
matrix[1][1]
matrix[1][2]
.
.
matrix[8][0]
matrix[8][1]
matrix[8][2]
.
.
matrix[8][8]

Comme on peut le voir ci-dessus, les éléments de n'importe quelle colonne donnée sont séparés par d'autres éléments dans les rangées correspondantes.

Donc, en passant, avec le pointeur p, vous pouvez parcourir les 81 éléments entiers de votre matrice si vous le souhaitez.

8voto

Vous pouvez obtenir la première colonne en utilisant une boucle comme

for(int i = 0; i < 9; i++)
{
    printf("Élément %d: %d", i, matrix[i][0]);
}

Je pense que l'assignation ne fonctionne pas correctement car vous essayez d'assigner quelque chose qui n'est pas une adresse à un pointeur.

(Désolé c'est du code c)

4voto

AxelOmega Points 660

Il n'y a aucune différence entre spécifier matrix[81] ou matrix[9][9]

matrix[r][c] signifie simplement la même chose que matrix[9*r+c]

Il existe d'autres conteneurs mieux adaptés aux tableaux multidimensionnels comme boost::multi_array

http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html

Pensez au tableau nu comme à l'allocation d'un morceau de mémoire contigu. Vous, le programmeur, devez ensuite gérer ce morceau de mémoire vous-même. Le nom nu du tableau, par exemple matrix, est un pointeur vers le premier élément de ce morceau de mémoire alloué. Ensuite, *(matrix+1) est la même chose que matrix[0][1] ou matrix[1].

2voto

zzk Points 1289

P est un tableau de int, matrix[0] est un pointeur..

1voto

Neil Points 24938

matrice elle-même est la chose la plus proche que vous puissiez avoir d'une colonne du tableau, en ce sens que (matrice + 1)[0][0] est la même que matrice[1][0].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X