(转)从一道面试题来搞清楚数组指针

下段代码的运行结果:
main() 
 {  
   int a[5]={1,2,3,4,5};  
   int *ptr=(int *)(&a+1);   
   printf("%d,%d",*(a+1),*(ptr-1)); 
} 
答:2,5 
     *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5 
  &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int) 
  int *ptr=(int *)(&a+1); 
  则ptr实际是&(a[5]),也就是a+5 
原因如下: 
  &a是数组指针,其类型为 int (*)[5]; 
  而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。 
  a是长度为5的int数组指针,所以要加 5*sizeof(int) 
  所以ptr实际是a[5] 
  但是prt与(&a+1)类型是不一样的(这点很重要) 
  所以prt-1只会减去sizeof(int*) 
  a,&a的地址是一样的,但意思不一样 
    a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址, 
    a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]. 
posted @ 2011-05-03 15:40  Fannic  阅读(1760)  评论(2编辑  收藏  举报