指针运算在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)));