Подтвердить что ты не робот

Почему m [1] - m [0] возвращает 3, где m - матрица 3x3?

Это мой код:

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]);

И почему

m[1] - m[0]

return 3? Я знаю, почему второе выражение вернет 10, но 1 st не кажется мне логичным.

4b9b3361

Ответ 1

В вашем коде:

 m[1] - m[0]

обозначает вычитание указателя, которое дает вам различие двух указателей на основе типа. В этом случае оба указателя дифференцируются на 3 элемента, поэтому результат равен 3.

Чтобы процитировать C11 стандарт, глава §6.5.6

Когда два указателя вычитаются, оба указывают на элементы одного и того же объекта массива, или один за последним элементом объекта массива; в результате возникает разница индексы двух элементов массива. [...]

и

[...] Иными словами, если выражения P и Q указывают соответственно на i -th и j -th элементы объект массива, выражение (P)-(Q) имеет значение i−j, если значение соответствует объекту типа ptrdiff_t. [....]

Чтобы лучше визуализировать изображение, см. следующее изображение

введите описание изображения здесь

Здесь s представляет собой двумерный массив, определенный как s[4][2]. Рассматривая тип данных для потребителей массива по 2 байта, пожалуйста, следуйте за элементами (индекс) и соответствующим расположением памяти (произвольно). Это даст лучшее представление о том, как на самом деле в памяти элементы массива смежны.

Итак, согласно представлению s[0] и s[1] дифференцируются двумя элементами: s[0][0] и s[0][1]. Следовательно, s[1] - s[0] приведет к результату 2.

Ответ 2

Потому что "разница" между m[1] и m[0] - это три элемента.

Это может быть проще понять, если вы посмотрите на это как на

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] |
+---------+---------+---------+---------+---------+---------+---------+---------+---------+

Разница между m[1] и m[0] заключается в трех элементах m[0][0], m[0][1] и m[0][2].