减去指针为什么是 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
.
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
.