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

Arrays 减去指针为什么4227140-4227136=1?,arrays,c,pointers,pointer-arithmetic,Arrays,C,Pointers,Pointer Arithmetic,文档说明了以下关于指向数组中单元格的指针的内容: 如果表达式p指向数组对象的第i个元素,则 表达式(P)+N(相当于N+(P))和(P)-N(其中N具有 值n)分别指向 数组对象,前提是它们存在 我有一个数组是这样声明的: static int heap [MANY]; 我将指针输出到堆: printf("heap = %ld\n", heap); 结果表明: heap = 4227136 这就是指向堆[0]的指针,对吗 接下来,我输出指向堆[1]的指针: printf

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

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

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

static int heap [MANY];
我将指针输出到堆:

printf("heap = %ld\n", heap);
结果表明:

heap = 4227136
这就是指向堆[0]的指针,对吗

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

printf("heap + 1 = %ld\n", (heap+1));
printf("(heap+1) - heap = %d\n", ((heap+1)-heap));
根据上面的引文,我希望指针的值
1
大于
4227136
,也就是说,我希望指针的值
4227137
。当我看到指针是
4
多于
4227136
时,我很惊讶:

heap + 1 = 4227140
为什么指向堆[1]
4
的指针比指向堆[0]的指针大

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

printf("heap + 1 = %ld\n", (heap+1));
printf("(heap+1) - heap = %d\n", ((heap+1)-heap));
我希望输出是:
4227140-4227136=4

相反,我得到的答案是
1

(heap+1) - heap = 1
我很困惑。为什么我会得到这些结果?

因为
sizeof(int)
在您的机器上是4个字节<代码>堆+1指向下一个元素。不是字节

运算符
[]
是指针运算的简单语法糖
a[1]
*(a+1)
相同。这有一个有趣的结果,
a[1]
1[a]
完成(即非
void
)指针根据指向类型的大小递增


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

考虑到您的报价,然后
堆[0]
堆+0
指向数组的第一个元素,而
堆[1]
堆+1
指向数组的第二个元素

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


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

指针加减与相应类型的
sizeof
大小一致。
根据上面的引文,我预计指针的值会比4227136的值大1
为什么?它特别指出,
分别指向数组对象的i+n和i-n元素
。第
i+1
元素不在地址
i+1
处,而是在
i+sizeof(int)
处。如果需要整数数学,请使用整数。将指针视为整数存在缺陷。指针加减法只是众多此类漏洞中的一个。还可以执行printf(“heap=%ld\n”,heap)。指针不是整数,也不是指针。