c语言指针、数组问题(1)

问:

int a[5]={1,2,3,4,5};

        int * p = (int *)(&a+1);

        printf(“%d”,p[-1]);


输出为什么是5,而不是1?&a+1是指向哪个数组元素的地址?

答:

   a的类型为一个数组,内含5个int型的变量(现假设a中首元素地址为100);
    &a获得指向数组的指针,指针的内容为a的地址(100),&a + 1 = 100 + sizeof(a) = 100 + sizeof(int)*5 = 100 + 4*5 = 120;

  (&a 的类型为指向数组的指针,该数组是由5个int组成的,&a 加一减一的偏移量为一个数组)
    int *p = (int*)(&a+1): 你把一个指向数组的指针强制转换为了一个int*类型的指针(此时p的内容为120)
     p 的类型为int* ,p 加一减一的偏移量为一个int
    p[-1] = *( p - 1) = *(120 - 1*sizeof(int)) = *(120 - 4) = *(a + 4) = a[4] = 5

 

另附:

   

int a[5]={1,2,3,4,5};可以理解成二维数组(一行五列):
int a[1][5]={1,2,3,4,5};
&a 就是 a[0]的地址。
(第一行的首地址)如果有二维数组(二行五列):
int a[2][5]={1,2,3,4,5,6,7,8,9,10}
&a+1  就是 a[1]的地址(第二行的首地址)
int *p = (int *)(&a+1);
 就是把二维数组 排成 一维,p[0] 的地址 就是 a[1]的地址, 
a[1][0] 元素的值是 6, p[0] 元素的值是 6
printf(“%d”,p[-1]); 就是打印 p[0] 左边的 那个元素的值,打出来正是 5 啊 

 

posted on 2010-11-18 14:00  leesy  阅读(222)  评论(0)    收藏  举报

导航