为什么m – m 返回3,其中m是一个3x3matrix?
这是我的代码:
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]
返回3
? 我知道为什么第二个expression式会返回10
但是第一个expression式对我来说似乎不合逻辑。
在你的代码中:
m[1] - m[0]
表示一个指针减法,它会根据types给出两个指针的区别。 在这种情况下,两个指针由3个元素区分,所以结果是3。
引用C11
标准,第6.5.6节
当减去两个指针时,都应指向相同数组对象的元素,或指向数组对象的最后一个元素之后的元素; 结果是两个数组元素的下标差异。 […]
和
换言之,如果expression式
P
和Q
分别指向数组对象的第i
个和第j
个元素,则expression式(P)-(Q)
具有提供的值i−j
该值适合于types为ptrdiff_t
的对象。 [….]
为了更好地形象化,请看下面的图片
这里s
是一个二维数组,定义为s[4][2]
。 考虑到数组使用者的数据types每个2字节,请遵循元素(索引)和相应的内存位置( 任意 )。 这将更好地说明内存中的实际情况,数组元素是连续的。
所以,根据表示, s[0]
和s[1]
由两个元素s[0][0]
和s[0][1]
来区分。 因此, s[1] - s[0]
将产生2的结果。
因为m[1]
和m[0]
之间的“差异”是三个元素。
如果你这样看,可能会更容易理解
m [0] m [1] m [2] | | | VVV + --------- + --------- + --------- + --------- --------- + + --------- + --------- + --------- + --------- + | 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]
这三个元素。