为什么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式PQ分别指向数组对象的第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]三个元素。