Comment obtenir une colonne d'un tableau multidimensionnel en C/C++?
int matrix[9][9],*p;
p=matrix[0];
ce qui fonctionne et donne la première ligne de matrix
, mais comment obtenir la première colonne de matrix
j'ai essayé p=matrix[][0];
? Aussi je ne comprends pas pourquoi ci-dessous le code d'erreur du compilateur ?
int matrix[9][9],p[9]; //it looks really ugly, byt why it doesn't work ?
p=matrix[0]; //compiler gives "invalid array assigment"
est-ce parce que les tableaux multidimensionnels sont des tableaux de tableaux - et nous devrions interpréter matrix[i][j]
comme j-ème élément de la i-ème tableau imbriqué ?
OriginalL'auteur Qbik | 2013-03-06
Vous devez vous connecter pour publier un commentaire.
En C/C++, les tableaux multidimensionnels sont en fait stockés en tant que dimensions des tableaux (dans la mémoire). Votre 2D matrice est stockée sous forme d'un tableau multidimensionnel avec des rangées de premier ordre. C'est pourquoi l'obtention d'une colonne à partir de la il n'est pas facile, et n'est pas fournie par défaut. Il n'est pas contiguë tableau dans le mémoire que vous pouvez obtenir un pointeur vers ce qui représente une colonne d'un tableau multidimensionnel. Voir ci-dessous:
Lorsque vous ne
p=matrix[0]
, vous êtes juste en train de le pointeur vers le premier élémentmatrix[0][0]
, et qui vous fait penser que vous avez obtenu le pointeur vers la première ligne. En fait, il est un pointeur vers l'ensemble contigu tableau qui contientmatrix
, comme suit:Comme vu ci-dessus, les éléments de chaque colonne sont séparés par d'autres éléments dans les lignes correspondantes.
Donc, comme une note de côté, avec le pointeur
p
, vous pouvez marcher à travers l'ensemble de 81 éléments de votre matrice, si vous vouliez.La sémantique sont différents oui, je faisais allusion à la disposition de la mémoire. Je vais ré-écrire la partie.
erreur, désolé, ils sont vraiment à côté les uns des autres dans la mémoire
OriginalL'auteur meyumer
Vous pouvez obtenir la première colonne à l'aide d'une boucle comme
Je pense que la cession ne fonctionne pas correctement parce que vous essayez d'affecter de quelque chose qui n'est pas une adresse d'un pointeur.
(Désolé c'est du code c)
Je crois qu'il devrait être
matrix[i][0]
comme le C et le C++ utiliser 0 comme premier élément.C'est la façon de le faire. Vous devez parcourir le tableau pour obtenir les éléments que vous souhaitez. Il n'y a pas de moyen facile parce que, comme mentionné précédemment, les éléments ne sont pas situés dans des emplacements de mémoire contiguë.
OriginalL'auteur
Il n'y a pas de différence entre la spécification de
matrix[81]
oumatrix[9][9]
matrix[r][c]
signifie tout simplement le même quematrix[9*r+c]
Il y a d'autres conteneurs mieux adapté fort tableaux multidimensionnels comme
boost::multi_array
http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html
Pense de la nue-tableau tout comme l'allocation contiguë morceau de mémoire. Vous, le programmeur doit alors gérer ce morceau de mémoire vous-même. Le nu nom de la matrice, par exemple
matrix
est un pointeur vers le premier élément de cette alloué morceau de mémoire. Puis*(matrix+1)
est le même quematrix[0][1]
oumatrix[1]
.matrix[81]
est le même quematrix[9][9]
? Ma compréhension est quematrix[9][9]
est équivalent àint * matrix[9]
, ce qui signifie que c'est un récipient de pointeurs, pas contigus emplacements de mémoire.Lorsque vous l'avez demandé, je suis devenu incertain. J'ai donc regardé et maintenant j'en suis sûr. Voir ici par exemple stackoverflow.com/questions/7784758/...
Je suis corrigé, merci!
J'ai besoin de faire une petite correction à ce. À partir d'une disposition de la mémoire de point de vue il n'y a pas de différence. Mais si le compilateur a des renseignements au sujet de l'original de la déclaration de tableau il y a une différence sur la façon dont il est interprété. Par exemple
matrix[R][C]
peut être consulté de façon linéaire à partir d'un pointeurint* mp (int*)matrix
, le cast est nécessaire pour éviter les mises en garde. Vous pouvez accéder aux lignes queint (row_ptr*)[C] = matrix
puis de l'arithmétique des pointeurs assurera de vous déplacer d'une ligne entière, par exemple(row_ptr+1)
pointe à la deuxième ligne. Aussi la valeur de l'accès doit être **(row_ptr+1). Il n'y a pas de pointeurs en mémoire.OriginalL'auteur
p est un tableau de type int matrice[0] est un pointeur..
p=*(matrix[0]);
ne fonctionne pas !est un int, vous ne pouvez pas affecter un entier à un tableau int
maintenant j'ai compris ! Je l'ai imprimé *p et de données a été correct, mais c'est seulement pointeur unique int
OriginalL'auteur zzk
matrix
lui-même est la chose la plus proche que vous pouvez obtenir à une colonne de la matrice, dans la mesure où(matrix + 1)[0][0]
est le même quematrix[1][0]
.OriginalL'auteur Neil
Si vous voulez que votre matrice à des endroits contigus, la déclarer comme un tableau multidimensionnel et d'exécuter la ligne et de la colonne de calcul vous-même:
Vous pouvez également effectuer une itération sur chaque colonne d'une ligne:
OriginalL'auteur Thomas Matthews
Statique déclaré tableaux vous pouvez y accéder comme continue 1D tableau,
p = matrix[0]
vous donnera la 1ère colonne de la 1ère rangée. Ensuite, le 1D tableau peut être consulté commep[i]
,*(p+i)
, oup[current_raw * raw_size + current_column)
.Les choses sont plus difficiles si un tableau 2D est représenté avec
**p
que cela sera interprété comme un tableau de pointeurs sur des tableaux 1D.OriginalL'auteur Georgi