考虑以下代码片段:
int (*p)[3];
int (*q)[3];
q = p;
q++;
printf("%d, %d\n", q, p);
printf("%d\n", q-p);
我知道指针算法是智能的,这意味着操作q++
提前q
提前有足够的字节指向下一个3整数数组,因此第一次打印时我并不感到惊讶是'12, 0
',这意味着递增q
会使其在12中变大。
但是第二张 令我感到惊讶。它打印1!
那么为什么它会打印1而不是12?它只是困惑我。
答案 0 :(得分:27)
与++
增量运算符类似,带有指针的-
减法运算符也会考虑所指向对象的大小。具体来说,返回的结果是指针值中的字节数差异除以指向对象的大小(在您的示例中为12)。所以差异是12个字节,除以12或1。
答案 1 :(得分:4)
如果你真的想知道差异,将每个指针转换为(char *)然后转换为(int)然后减去。这应该给你答案。
此代码为您提供绝对值:
printf("%d\n", abs((int)((char*)q) - (int)((char*)p)));
请记住包含math.h。
编辑: 正如评论中指出的那样,我们不需要双重演员。将每个指针指针强制转换为int然后减去与上面的(不必要的)双重投射相同的答案。
printf("%d\n", abs((int)(q) - (int)(p)));