指针的强制转换

前面曾经讲过,如果指针变量指向的变量类型相同,两个指针变量可以互相赋值。如果指向的变量类型不同,可以先对指针进行类型强制转换。下面用一个具体的例子说明:
main()
{
long num=0xAAAABBBB, *pl=# /*num初始化为16进制数AAAABBBB*/
int *pn;
printf("\npl=%lX",*pl); /*%lX:以16进制方式输出一个long型数*/
pn=(int *)pl;
printf("\npn=%X", *pn);
pn++;
printf("\npn=%X", *pn);
}
程序运行的结果为:
pl=AAAABBBB
pn=BBBB
pn=AAAA

如图所示,long型变量num在内存占用4个字节,假设首地址为FFC0。因为整型数据在内存中存放的原则是低字节在前,高字节在后(参见汇编语言),所以FFC0开始的2个字节实际存放的是BBBB,FFC2开始的两个字节存放的是AAAA。初始化后,指针变量pl存放变量num的首地址,*pl的值就是变量num的值。
语句pn=(int *)pl;的作用是:将指针变量pl的类型进行强制转换,并将地址值赋给指针变量pn,赋值结束后,指针变量pn的值为pl保存的地址值FFC0。指针变量pn被定义为指向int型变量,因此系统取*pn的值时,读取从地址FFC0开始的2个字节,因此这时*pn的值为BBBB。
语句pn++;将指针变量pn自加1,根据指针加法的规则,pn被重新赋值为地址值FFC2,因此*pn的值为地址FFC2开始的2个字节的内存单元值,即AAAA。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值