2
#include<stdio.h>
int main(){
    int a[5] = {0,1,2,3,4};
    int * ptr;
    ptr =(int *) &a;
    printf("\n&a:%u,&a[0]:%u,ptr:%u\n",&a,&a[0],ptr);
    ptr = (int*)(&a+1);
    printf("\n&a:%u,&a[0]:%u,ptr:%u\n",&a,&a[0],ptr);
    ptr = (int*)(&a);
    ptr = (int*)(&a[0]+4);
    printf("\n&a:%u,&a[0]:%u,ptr:%u,*ptr:%d\n",&a,&a[0],ptr,*ptr);
    return 0;
}

o/p:

&a:3213284540,&a[0]:3213284540,ptr:3213284540

&a:3213284540,&a[0]:3213284540,ptr:3213284560

&a:3213284540,&a[0]:3213284540,ptr:3213284556,*ptr:4

在上面的代码中&a&a[0]给出了相同的地址3213284540。但是这两种情况在添加时1会给出不同的地址。

&a[0]+1 => 3213284540 + 4     = 3213284544   [The value stored in this address is '1']
&a+1    => 3213284540 + (5*4) = 3213284560   [Goes Out of bounds of the array] 

&a+1 is equivalent to sizeof(array)+1. 

但是编译器如何解释这个&a[0]+1&a+1

4

1 回答 1

7

但是编译器如何解释 &a[0]+1 和 &a+1

它是指针算术,因此了解指向的类型和一件基本的事情总是很重要:添加1到指针使其指向某个“下一个”元素。

  • 在您的示例&a[0]中是类型int *,因此添加 1会将指针移动到下一个 int。所以地址应该增加4/8字节左右,取决于sizeof(int)

  • 但是,&a是类型int (*)[5]。因此,向其添加 1会将指针移动到下一个数组。实际上,地址应该增加sizeof(a).


旁注:%p打印指针值时使用。

于 2012-09-13T05:11:55.293 回答