2009-04-17 56 views
12

考虑下面的代码片断:指针运算在C

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呢?它只是让我困惑。

回答

27

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

+0

所以没有办法采取两个指针,并获得他们的差异字节? – 2009-04-17 09:14:21

+8

将指针转换为(char *),然后您将得到字节差异。 – 2009-04-17 09:15:59

4

如果你真的想知道投三分球各一个(字符*)的差异,然后(INT),然后减去。这应该给你答案。

此代码为您提供了绝对值:

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

请记住,包括math.h中

编辑: 正如评论指出,我们并不需要一个双投。将每个指针投射到一个int然后减去给出与上面(不需要的)双重铸造相同的答案。

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