本文档介绍了以下关于数组中单元格的指针:
如果表达式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
。