Arrays 减去指针为什么4227140-4227136=1?
文档说明了以下关于指向数组中单元格的指针的内容: 如果表达式p指向数组对象的第i个元素,则 表达式(P)+N(相当于N+(P))和(P)-N(其中N具有 值n)分别指向 数组对象,前提是它们存在 我有一个数组是这样声明的: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
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)代码>。指针不是整数,也不是指针。