一个较为有意思的题

下面的C代码在VC++6.0下的运行结果是什么?请详细说明原因。
#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;

答案:

5,2000000

解析:

查看一下内存分布情况:

int   a[5]={1,2,3,4,5};
则程序的内存分配(即高地址在前低地址在后)为
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
/|/
|
a    

第一点:
int *ptr1=(int  *)(&a+1);
首先,
&a获得的是数组的地址,这样增长的单元则成了sizeof(a)=20
这样ptr1指向a[
5](当然,数组的下标是从0开始,因此正常只有0-4有效.)
ptr1[
-1]相当于ptrl-1,也就相当于a[4],因此输出为5.

第二点:
int  *ptr2=(int  *)((int )a+1);
(
int   )a==>能过强制类型转换,此时的(int)a只为一个般的int型值.其值为a[0]的地址.
(
int)a+1==>其值为a[0]的地址+1
int  *ptr2=(int  *)((int   )a+1);==>此时指向的地址为0000 00 02
相当于数值02
00 00 00(十进制为:33554432)
最后由于
printf(
"%x",*ptr2);==>要求输出为16进制的格式,当然就是2000000

 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值