打印

关于强制类型转换你可能需要知道的

[复制链接]
566|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
<div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">强制类型转换</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">我们知道,强制类型转换分为隐性类型转换以及显性类型转换。对于隐性转换,由编译器完成,它总是由少字节类型转换为多字节类型。显性类型转换则根据程序员的需要强制某种数据类型转换为另一种数据类型。 这个没毛病。</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">那么,强制类型转换的一个陷阱在哪呢 - 指向不同数据类型的指针之间的转换,让我们来看下面一个例子。</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体"><img src="https://bbs.21ic.com/forum.php?mod=image&aid=938274&size=300x300&key=d6760a3a8a9274c1&nocache=yes&type=fixnone" border="0" aid="attachimg_938274" alt=""></font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">我们看到,数据结果并不是我们预期的。那么,造成这种原因是什么呢?</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">程序中test变量是字符型,它对应的指针是一个指向字符类型的指针(&test),而p1是指向int类型指针。当把test变量的地址强制转换为int型指针并给p1后,实际p1的指向的是被扩展了内存单元的test地址。如下图</font></div><div yne-bulb-block="image"><font face="宋体"><img data-media-type="image" src="file:///C:/Users/Administrator/AppData/Local/YNote/data/qq3F3AF51F618E47699C3A439CE720209B/1efae4cb315f4e278ffa406553a99fd9/clipboard.png" data-attr-org-src-id="F314787CED994C56A76952D8093D892A"></font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体"><img src="https://bbs.21ic.com/forum.php?mod=image&aid=938268&size=300x300&key=48ae40c818291b1b&nocache=yes&type=fixnone" border="0" aid="attachimg_938268" alt=""></font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">由此可知,p1指向的值就是test1部分的数据加上了地址扩展部分的数据。所以,在打印*p1的时候打印的值不是50,而是一个意料之外的值。</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">同理,如果使用int型指针指向double型指针时也会出现内存被截取的问题。</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">那可能你要问了,不同类型指针之间的转换会出现地址扩展与截断的问题,那为什么变量之间的类型转换就不会出现这种问题呢?</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">
</font></div><div yne-bulb-block="paragraph" style="line-height: 1.75;"><font face="宋体">其实,不论是不同指针类型之间的转换还是不同数据类型之间的转换都会发生截取与扩张的问题。不同数据类型之间的转换编译器通过高字节补0或者高字节截取的办法来解决,并没有发生内存单元的截取与扩张。而不同指针类型之间的转换编译器则是通过内存扩张与截取来解决,这就会导致出现如上所示的问题。</font></div>



2E1A6BB6BA144FE2B1195BCE90FB8218.png (8.83 KB )

2E1A6BB6BA144FE2B1195BCE90FB8218.png

X{})N1X)%EN7D$HW[PMM)X3.png (30.65 KB )

X{})N1X)%EN7D$HW[PMM)X3.png

相关帖子

沙发
红蛋大叔|  楼主 | 2017-11-3 21:44 | 只看该作者
失误了,重新发过。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

69

帖子

3

粉丝