指针与数组--a与&a区别

        

       假设声明了一个数组a,则&a表示数组a的首地址,a与&a[0]表示数组a首元素的首地址,那么&a+1与a+1有哪些区别呢?通过下面的实验来说明。

int i = 0;
int a[5]={1,2,3,4,5};
int *p = (int *)(&a+1);
for(i=0;i<5;i++)
{
printf("a+%d = 0x%p,a[%d] = %d\n",i,a+i,i,a[i]);
}
printf(" a  = 0x%p,&a = 0x%p,&a+1 = 0x%p\n",a,&a,&a+1);
printf("a+1 = 0x%p,*(a+1) = %d,p-1 = 0x%p,*(p-1) = %d\n\n",a+1,*(a+1),p-1,*(p-1));


        上述程序首先声明数组a,包含5个元素,然后打印输出数组中每个元素的地址和内容;接着比较&a+1与a+1的区别。

int *p = (int *)(&a+1); ------声明指针p指向的地址

printf(" a  = 0x%p,&a = 0x%p,&a+1 = 0x%p\n",a,&a,&a+1);    ------分别 a,&a,&a+1的地址。

printf("a+1 = 0x%p,*(a+1) = %d,p-1 = 0x%p,*(p-1) = %d\n\n",a+1,*(a+1),p-1,*(p-1)); ----分别输出a+1,*(a+1),p-1,*(p-1)


调试过程中局部变量地址及内容如下:


调试结果如下:

通过以上结果分析如下:

(1)int *p = (int *)(&a+1);&a表示数组a的首地址0x0012ff44,p的地址为0x0012ff58,p的地址与&a+1的地址相同。

&a+1:取数组a的首地址0x0012ff44,该地址加上sizeof(a)的值,即&a+5*sizeof(int)=0x0012ff44+5*4=0x0012ff44+0x14=0x0012ff58

p-1=0x0012ff58-sizeof(int)=0x0012ff54=0x0012ff44+0x10=0x0012ff44+4*sizeof(int) ,即p-1与数组元素a[4]的地址相同,*(p-1)= a[4]=5。

(2)*(a+1) a+1是数组a下一个元素的地址,即 &a[1]=0x0012ff44+sizeof(int)=0x0012ff48,即*(a+1)=a[1]=2



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值