今天测试了一个程序,来理解一下数组指针,感觉有所收获,在此分享。
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 ",ptr2[0]); 8 printf(" ptr3[0]:%d ",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
若将这个概念用到二维数组,会怎样呢?希望大家一起探讨和分享!