Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的指针算法_C_Pointers_Pointer Arithmetic - Fatal编程技术网

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)