指针值的改变带来的问题

  在今天做题时遇到了这样一个问题

#include<stdio.h>

int main()
{
    int arr[] = {1,2,3};
    int *p = (int *)((int)&arr+1);
    printf("%08x\n",*p); 

    return 0;
}

求打印结果。

要做这道题要对数组arr的实际存储有所了解。假设arr从100号内存地址开始,那么arr[0]所占100-104,arr[1]占104-108,以此类推。整形1的10进制值为0x 0000 0001,在pc上按小端存储为0x 0100 0000,以此类推整形2的存储为0x 0200 0000 。如下图:

数组arr的前两个元素

 

 

 

 

 

 

 

 

 

按照上图,(int)&arr这个表达式个结果是100(&arr与arr值相同,有兴趣可以测试一下)。那么(int)&arr+1的值就是101。再将其强转为int *类型,这个值又表示指向101-105这段内存的地址。int *p = (int *)((int)&arr+1);一句后,p表示101-105的位置。

红色示指针p指向的内容

小端存储值为0000 0002,所以*p的值为0x 0200 0000。%08x打印8位16进制,所以输出结果位0200 0000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值