这是我的代码:
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 对我来说似乎不合逻辑。
答案 0 :(得分:55)
在您的代码中:
m[1] - m[0]
表示指针减法,它根据类型给出两个指针的差异。在这种情况下,两个指针都由3个元素区分,因此结果为3。
引用C11
标准,章节§6.5.6
当减去两个指针时,两个指针都指向同一个数组对象的元素, 或者超过数组对象的最后一个元素;结果是差异 两个数组元素的下标。 [...]
和
[...]换句话说,如果表达式
P
和Q
分别指向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的结果。
答案 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]
。