数组、数组名和指针问题

 下面程序最终显示结果是什么?

#include   <stdio.h>
int   main()
{
int   a[5]={1,2,3,4,5};
int   *ptr1=(int   *)(&a+1);
int   *ptr2=(int   *)((int   )a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return   0;
}

tc 编译

5,200

指针的步进是参照其所指对象的大小;

虽然a=&a;但a是一个指向数组第一个元素的指针,a+1=a+sizeof(int);

而&a产生一个指向全部数组的指针,&a+1=(int)a+sizeof(a);

&a 就相当与一个指向数组的指针  如int (*p)[5]。

&a   取得地址以后加一的操作,指针增加了sizeof(a)这么多的绝对地址。这应该是指针加了20,然后一个-1有减去了4,这样相当于指针的绝对地址加了16,指向的就是a[4]的首地址

a   的内存存放
地址:   00   01   02   03   04   05   06   07   08
数据:   01   00   02   00   03   00   04   00   05
a   =   00;
ptr2   =   (int*)((int)a   +   1);
ptr2   =   01;
所以ptr2指向的内存为
地址:   01   02  

数据:   00   02  

即*ptr2   =   0x200;

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值