int *ptr=(int *)(&a+1) 与int a[5]={1,2,3,4,5} 指针的变动

来源:互联网 发布:java scheduler 编辑:程序博客网 时间:2024/05/16 11:20

 今天看了一段有关数组与指针的代码,里面的一些问题始终无法还有些解不开。

代码如下:

       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。