求大牛解决c语言指针的强制转化问题!!!!!加上(short *)有什么用?

inta=0x12345678;char*p;//p=(short*)&a;vs环境下的反汇编:00AF23A5leaeax,[ebp-8]00AF23A8movdwor... int a=0x12345678;char *p;//p=(short *)&a;vs环境下的反汇编:00AF23A5 lea eax,[ebp-8] 00AF23A8 mov dword ptr [ebp-18h],eax //这里编译器不会鸟 (short *)只是将a的地址给了p*p=1;00AF23AB mov eax,dword ptr [ebp-18h] 00AF23AE mov byte ptr [eax],1 //这里编译器也没有理会刚才的(short *),还是用的定义时的char(byte)那么加上(short *)有什么用??既然是汇编表现成这种机制为什么要加指针强制转化?感谢大神解决我的疑惑~~ 展开
 我来答
风若远去何人留
2017-05-18 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450096
专业C/C++软件开发

向TA提问 私信TA
展开全部
指针的强制转换 并不影响最终的结果
更多的是给编译器用的。
在C里面对指针不同类型相互赋值做的要求级别并不高
当源类型和目标类型不匹配时只是报一个warning, 而C++里面就是错误了。
比如你这个 正确做法应该是
p=(char *)&a;

至于为什么要加强制转换, 其最根本的原因是
不同类型的指针,进行相互赋值的时候是很容易出现越界的。比如char *p, 这个指针可能只指向一个字节的单元,(char c; p=&c;这样), 如果赋值给int*q=p; 然后按照*q去赋值取值,就是绝对的越界操作。
对于编程中,如果不小心写错了,那么就会引起不可预知后果,甚至可能是你运行测试几十次都正常,但真正出成品了,到客户手里莫名其妙的出错,查起来超难。
所以要求加强制转换,就是为了避免这样的不小心。 人性化一点的说,就是告诉编译器,我知道我在不同类型之间赋值,我已经知道了这样做的后果,也已经确定了可以承担这个后果,你不要管我了。 于是编译器就不管了,后果嘛,自负。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式