为什么m [1] - m [0]返回3,其中m是3x3矩阵?

时间:2016-03-07 12:53:47

标签: c arrays matrix

这是我的代码:

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?我知道为什么第二个表达式会返回10但是1 st 对我来说似乎不合逻辑。

2 个答案:

答案 0 :(得分:55)

在您的代码中:

 m[1] - m[0]

表示指针减法,它根据类型给出两个指针的差异。在这种情况下,两个指针都由3个元素区分,因此结果为3。

引用C11标准,章节§6.5.6

  

当减去两个指针时,两个指针都指向同一个数组对象的元素,   或者超过数组对象的最后一个元素;结果是差异   两个数组元素的下标。 [...]

  

[...]换句话说,如果表达式PQ分别指向i - 和j - 元素   一个数组对象,表达式(P)-(Q)具有值i−j,前提是该值适合类型为ptrdiff_t的对象。 [....]

为了更好地进行可视化,请参阅下图

enter image description here

此处,s是二维数组,定义为s[4][2]。考虑到数据消费者的数据类型每个2字节,请遵循元素(索引)和相应的内存位置(任意)。这将更好地说明内存中实际上数组元素是如何连续的。

因此,根据表示,s[0]s[1]由两个元素s[0][0]s[0][1]区分。因此,s[1] - s[0]将产生2的结果。

答案 1 :(得分:35)

因为"差异" 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]