C语言中的指针算法
考虑以下代码片段:C语言中的指针算法,c,pointers,pointer-arithmetic,C,Pointers,Pointer Arithmetic,考虑以下代码片段: 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呢?这让我很困惑。像+增量操作符一样,带有指针的-减法操作符也会考虑
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呢?这让我很困惑。像
+
增量操作符一样,带有指针的-
减法操作符也会考虑所指向对象的大小。具体来说,返回的结果是指针值的字节数差除以指向对象的大小(在您的示例中为12)。因此,差值是12字节,除以大小12或1。如果您真的想知道差值,请将每个指针转换为a(char*),然后转换为(int),然后进行减法运算。这应该会给你答案
此代码为您提供了绝对值:
printf("%d\n", abs((int)((char*)q) - (int)((char*)p)));
记住要包括数学
编辑:
正如在评论中指出的,我们不需要双重演员阵容。将每个指针指针转换为一个整数,然后进行减法运算,得到的结果与上面的(不必要的)双精度转换相同
printf("%d\n", abs((int)(q) - (int)(p)));
因此,无法获取两个指针的字节差?将指针强制转换为(char*),然后就可以得到字节差。@Leif:或者将差值乘以sizeof(您的_类型)。如果sizeof(int)