这是我的代码:
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章
当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异.[...]
和
[...]换句话说,如果表达式
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的结果.
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]
.
归档时间: |
|
查看次数: |
1899 次 |
最近记录: |