36 votes

Pourquoi m [1] - m [0] renvoie-t-il 3 où m est une matrice 3x3?

Ceci est mon code:

 int m[][3] = {
               { 0 , 1 , 2  },
               { 10, 11, 12 },
               { 20, 21, 22 }
             };
printf("%d %d\n", m[1] - m[0], m[1][0] - m[0][0]);
 

Et pourquoi

 m[1] - m[0]
 

retour 3 ? Je sais pourquoi la deuxième expression retournerait 10 mais le 1 er ne semble pas logique pour moi.

55voto

Sourav Ghosh Points 54713

Dans votre code:

 m[1] - m[0]

désigne un pointeur de la soustraction qui vous donne la différence des deux pointeurs basés sur le type. Dans ce cas, les deux pointeurs sont différenciés par 3 éléments, de sorte que le résultat est 3.

Pour citer C11 standard, chapitre §6.5.6

Lorsque les deux pointeurs sont soustraits, à la fois doit pointer sur le même objet array, ou un au-delà du dernier élément du tableau d'objet, le résultat est à la différence de la les indices des deux éléments du tableau. [...]

et

[...] En d'autres termes, si les expressions P et Q point de pour, respectivement, l' i-th et j-th éléments de un objet de tableau, l'expression (P)-(Q) a la valeur i−j à condition que la valeur s'inscrit dans un objet de type ptrdiff_t. [....]

Pour aider à mieux visualiser, veuillez voir l'image suivante

enter image description here

Ici, s est un tableau à deux dimensions, définies comme s[4][2]. Considérant le type de données de la matrice des consommateurs 2 octets chacun, veuillez suivre les éléments (index) et correspondant à l'emplacement de mémoire (arbitraire). Cela vous donnera une meilleure compréhension de la façon réellement dans la mémoire, les éléments du tableau sont contigus.

Donc, comme pour la représentation, s[0] et s[1] sont différenciés par deux éléments, s[0][0] et s[0][1]. Par conséquent, s[1] - s[0] , donne un résultat de 2.

36voto

Joachim Pileborg Points 121221

Parce que la "différence" entre m[1] et m[0] est de trois éléments.

Il pourrait être plus facile à comprendre si vous regardez comme ça

m[0] m[1] m[2]
| | |
v v v
+---------+---------+---------+---------+---------+---------+---------+---------+---------+
| m[0][0] | m[0][1] | m[0][2] | m[1][0] | m[1][1] | m[1][2] | m[2][0] | m[2][1] | m[2][2] |
+---------+---------+---------+---------+---------+---------+---------+---------+---------+

La différence entre m[1] et m[0] est le trois éléments m[0][0], m[0][1] et m[0][2].

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