减法指针为什么4227140-4227136=1



本文档介绍了以下关于数组中单元格的指针:

如果表达式p指向数组对象的第i个元素,则表达式(P(+N(等价地,N+(P((和(P(-N(其中N具有值n(分别指向数组对象,前提是它们存在。

我有一个这样声明的数组:

static int heap [MANY];

我输出指向堆的指针:

printf("heap = %ldn", heap);

输出显示:

heap = 4227136

这就是指向heap[0]的指针,对吧?

接下来,我输出指向heap[1]:的指针

printf("heap + 1 = %ldn", (heap+1));

根据上面的引用,我预计指针的值1将大于4227136,即,我预计该指针的值为4227137。当我看到指针是4而不是4227136:时,我很惊讶

heap + 1 = 4227140

为什么指向heap[1]的指针4多于指向heap[0]的指针?

然后我尝试减去指针:我从heap[1]:中减去heap[0]

printf("(heap+1) - heap = %dn", ((heap+1)-heap));

我预计输出为:4227140 - 4227136 = 4

相反,我得到了1的答案:

(heap+1) - heap = 1

我很困惑。为什么我会得到这些结果?

因为sizeof (int)在您的机器上是4个字节。CCD_ 16指向下一个元素。不是字节。

运算符[]是指针运算的简单语法糖。CCD_ 18与CCD_。这就产生了CCD_ 20和CCD_。

完整(即非void(指针根据指向类型的大小递增。

考虑一下,如果您的系统上有sizeof(int) == 4,并且您有一个指向int数组的指针,比如int data[] = {1, 2, 3, 4, 5}; int *p = data;,您希望用*(p + 1)取消引用什么?元素sizeof(int)字节向上,而不是下一个字节向上。

考虑到您的引号,则&heap[0]heap + 0指向数组的第一个元素,而&heap[1]heap + 1指向数组的第二个元素。

因此CCD_ 32等于CCD_。也就是说,指向同一数组元素的两个指针的差等于指针之间元素的数量(正或负(。

另一方面,当heap + 1指向数组的第二个元素时,指针中存储的地址与数组的第一个元素的地址相差值sizeof( heap[0] ),或相同的值sizeof( int ),在您的情况下,该值等于4

相关内容

  • 没有找到相关文章

最新更新