减去指针为什么是 4227140 - 4227136 = 1?

Subtracting pointers why is 4227140 - 4227136 = 1?

This 文档说明了以下关于指向数组中单元格的指针的内容:

if the expression P points to the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and (P)-N (where N has the value n) point to, respectively, the i+n-th and i-n-th elements of the array object, provided they exist.

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

static int heap [MANY];

我输出指向堆的指针:

printf("heap = %ld\n", heap);

输出显示如下:

heap = 4227136

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

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

printf("heap + 1 = %ld\n", (heap+1));

根据上面的引述,我预计指针的值 1 多于 4227136,即我预计指针的值 4227137。当我看到指针比 4227136:

4 时,我很惊讶
heap + 1 = 4227140

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

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

printf("(heap+1) - heap = %d\n", ((heap+1)-heap));

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

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

(heap+1) - heap = 1

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

因为 sizeof (int) 在你的机器上是 4 个字节。 heap+1 指向下一个元素。不是字节。

运算符[]是指针运算的简单语法糖。 a[1]*(a+1) 相同。这有一个有趣的结果,即 a[1]1[a] 相同。

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

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

考虑到你的引述,然后 &heap[0]heap + 0 指向数组的第一个元素,而 &heap[1]heap + 1 指向数组的第二个元素.

所以 ( heap + 1 ) - ( heap + 0 ) 等于 1。即指向同一数组元素的两个指针之差等于指针之间元素的个数(正数或负数)。

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