Ответ 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.