指针运算在C中

考虑下面的代码片段:

int (*p)[3]; int (*q)[3]; q = p; q++; printf("%d, %d\n", q, p); printf("%d\n", qp); 

我知道指针运算是智能的,这意味着操作q++提前q足够多的字节指向下一个3整数数组,所以我不惊讶第一个打印是12, 0 ',这意味着增加q在12日更大。

但是第二张照片确实给我带来了惊喜。 它打印1!
那么为什么要打印1而不是12呢? 它只是困惑我。

++增量运算符一样,带指针的-减法运算符也会考虑被指向的对象的大小。 具体来说,返回的结果是指针值除以指针对象的大小(在本例中为12)中的字节数差异。 所以差别是12个字节,除以12或1。

如果你真的想知道差异转换每个指针(char *),然后(int),然后减去。 这应该给你答案。

这段代码给你的绝对值:

 printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

请记住包含math.h.

编辑:正如在评论中指出,我们不需要双重演员。 将每个指针投射到一个int然后减去,就可以得到与上面(不需要的)重复铸造相同的答案。

 printf("%d\n", abs((int)(q) - (int)(p)));