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

Mar*_*cus 36 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]);
Run Code Online (Sandbox Code Playgroud)

为什么呢

m[1] - m[0]
Run Code Online (Sandbox Code Playgroud)

回来3?我知道为什么第二个表达式会返回,10一个表达式对我来说似乎不合逻辑.

Sou*_*osh 55

在你的代码中:

 m[1] - m[0]
Run Code Online (Sandbox Code Playgroud)

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

引用C11标准,第6.5.6章

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

[...]换句话说,如果表达式PQ指向,分别为i和第j一个数组对象的个元素,表达式(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的结果.


Som*_*ude 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].