今天看了一段有关数组与指针的代码,里面的一些问题始终无法还有些解不开。
代码如下:
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
运行结果如下:显示2 和5
在进行GDB调试的时候 P(&a+1) 显示的结果是 int (*)[5] 有点糊涂了,&a 数组a[5] 的首地址,*(a+1)是代表第二个元素的地址,那么(&a+1)又指向了哪里?
按结果显示应该是指向了a[5]的第五个元素的的地址,即a[4] 的地址了,为何?? 奇怪的还在后面
继续调试 显示 ptr 的结果是 int*, 而*(a+1)显示的是2(这个好理解是正确的),*ptr 的结果是 -1073748128
接着 *(ptr-1) 显示的是5 ,数组和指针的没弄明白。
在书上给 出了这样一个解释,提到&(a+1)指的是下一个数组的首地址,并且已经越过了数组的界限,还是有些似懂非懂的感觉,希望后面能够彻底顿悟数组与指针的内容。
&a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也
就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。
*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的
首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,&a+1 是下一
个数组的首地址。所以输出2
*(ptr-1): 因为ptr 是指向a[5],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[4] ,
输出5。