C语言强制类型转换

C语言的指针真的很灵活,这是我之前做过的一道关于C语言指针与强制类型转换的一道题,我以我的理解分享给大家看看,图画的有点丑不要介意

#include <stdio.h>

int main(void)
{
	long a[4]={1,2,3,4};
	long *p1=(long*)(&a+1);
	long *p2=(long*)((long)a+1);
	
	printf("%lx\n",p1[-1]);
	printf("%lx\n",*p2);
	
	return 0;
}

运行结果:

在这里插入图片描述

分析: long *p1=(long *)(&a+1);

(&a+1): 数组a的地址加一

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AmaTNUsi-1631708338655)(file:///C:\Users\航哥\AppData\Local\Temp\ksohtml\wps17C3.tmp.jpg)]

&a+1的地址指向了蓝色区域

因为P1是long*类型指针,因此p1所代表的地址为红色区域

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1IsHvTC-1631708338658)(file:///C:\Users\航哥\AppData\Local\Temp\ksohtml\wps1822.tmp.jpg)]

所以,p1[-1] 就是p1指针向后移动一位在解引用,p1[-1]为4

long p2=(long)((long)a+1)

逐次分解,首先看 a+1

a表示数组首元素地址,因此a+1表示第二个元素的地址。

假设a的地址为0x123456,那么a+1表示为0x123456+8

但是,这里它把a的地址强制类型转换成了long型,所以(long)a+1 的值因该为0x123456+1

然后在强制类型转换为long*型相当于地址向上偏移了一个字节。由于long在64位编译器中占8个字节,所以P2所指向的位置为下图红色区域。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5s1SWUf7-1631708338660)(file:///C:\Users\航哥\AppData\Local\Temp\ksohtml\wps1833.tmp.jpg)]

而1在64位机存储形式位0x0000000000000001(用16进制表示)

其在内存的存放形式如下图所以

[外链图片转存中...(img-cyUIWoWf-1631708338661)]

所以红色区域解引用为200000000000000

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值