数组指针的一个易错点

  今天测试了一个程序,来理解一下数组指针,感觉有所收获,在此分享。

 1 int main()
 2 {
 3     int a[6]={1,2,3,4,5,6};
 4     int* ptr1=(int *)&a;
 5     int* ptr2=(int *)(&a+1);
 6     int* ptr3= ptr1 + 1;
 7     printf(" ptr2[0]:%d\n",ptr2[0]);
 8     printf(" ptr3[0]:%d\n",ptr3[0]);
 9     return 0;
10 }

        首先,大家可以猜测下输出什么结果。

        接下来,问大家一个问题,a[6]是一个数组,那么a与&a的区别是什么?我们知道,a代表的是一个数组的首地址,那&a呢?(对于函数而言也是这样,函数名和函数名取个地址似乎没区别。)

        我们,接着看,int* ptr1=(int *)&a;为什么&a前面有个(int *)这里将其强制转换类型干什么?我们将(int *)去掉编译试试,编译器会报错://“初始化”: 无法从“int (*)[6]”转换为“int *”;(编译器为VS2012)这说明&a并不是“int *“类型,而是“int (*)[6]”类型。

       好了,我们看到区别了,a是“int *”类型,而&a是“int (*)[6]”类型。但是,只知道这些是没有意义的,我们继续往下看;

      

      通过VS2012编译器观察,a和&a的地址值是一模一样的都是0x14fcec,在数值上他们是一样的!我们再看a + 1的值是多少它是0x14fcf0

我们将0x14fcf0-0x14fcec = 0x04;我们发现(a + 1)的值比a的值大4,这个好理解:因为数组a是一个int型数组所以,而一个int占据4个字节。

我们再比较一下&a和(&a + 1)用0x14fd04 - 0x14fcec = 0x18 = 24;为什么(&a + 1)比 &a大24呢?我们猜想一下,是不是因为数组a里有6个整形数,4 × 6 = 24. 确实是这样的,不信你可以看看将数组改成5你看看地址是不是加了20.

      现在,我们总结一下,a和&a表示的是同一个地址,但是他们等级不同(类型不同),a + 1,地址会递增int的长度,而&a + 1,地址会递增

int的长度×数组元素的个数。

     在回到,源程序,结果:

  ptr2[0]:-858993460//访问越界了

      ptr3[0]:2

     若将这个概念用到二维数组,会怎样呢?希望大家一起探讨和分享!

 

 

 

 

 

posted @ 2013-09-18 15:20  宋桓公  阅读(352)  评论(0编辑  收藏  举报