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?这让我很困惑。

4

2 回答 2

27

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

于 2009-04-17T09:07:54.980 回答
4

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

此代码为您提供绝对值:

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

记得包含 math.h。

编辑:正如评论中指出的那样,我们不需要双重演员。将每个指针指针转换为一个 int 然后减去,给出的答案与上面的(不必要的)双重转换相同。

printf("%d\n", abs((int)(q) - (int)(p)));
于 2009-04-17T09:34:44.277 回答