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

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

代码如下:

       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。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值