两种强制性转换有什么区别?
本帖最后由 catch 于 2014-7-16 12:50 编辑①.
int a = 2;
long b = long (a);
printf("0x%x\n",&a);
②.
int a = 2;
long *b = (long *)&a;
printf("0x%x\n",&a);
大家说,以上两种转换有什么区别?
第一个是对a的值进行转换第二个是对a的地址进行转换
#include<stdio.h>
int main()
{
double p;
p = 5.5;
printf("%d\n",p);
printf("%d\n",(int)p);
printf("%d\n",(int*)&p);
printf("%d\n",&p);
return 0;
}
自己输出看看吧 牡丹花下死做鬼 发表于 2014-7-16 12:18
第一个是对a的值进行转换第二个是对a的地址进行转换
自己输出看看吧
我问的是本质上什么区别,不是输出的结果~ 牡丹花下死做鬼 发表于 2014-7-16 12:18
第一个是对a的值进行转换第二个是对a的地址进行转换
自己输出看看吧
后两者的输出结果一样,为什么? catch 发表于 2014-7-16 12:36
后两者的输出结果一样,为什么?
应为地址本身就是整形的 catch 发表于 2014-7-16 12:36
我问的是本质上什么区别,不是输出的结果~
没什么区别啊
double p;
printf("%d\n",(int*)&p);
等于
double p;
int i;
i = &p;
printf("%d\n",(int)p);
这两个完全是一样的啊
牡丹花下死做鬼 发表于 2014-7-16 12:39
没什么区别啊
double p;
printf("%d\n",(int*)&p);
用途完全一样? catch 发表于 2014-7-16 12:44
用途完全一样?
就是一个转换变量的值
一个转换变量的地址啊 牡丹花下死做鬼 发表于 2014-7-16 13:04
就是一个转换变量的值
一个转换变量的地址啊
そうか ~:big 本帖最后由 oggplay 于 2014-7-16 15:02 编辑
有趣的例子,以下是我64位机器程序及结果
#include <stdio.h>
int main(){
int a2 = 2;
long *b2 = (long *)&a2;
printf("&b2=%p b2=%p &a2=%p\n",&b2,b2,&a2);
return 0;
}
两者有本质上的区别。前者,是将a的值进行转化后赋值给b;后者,直接将以变量a的地址为首地址的内存空间数据赋予新的使用意义。
举例说明,int类型a值为2,将a转化成double类型的b。前一种转化方式,会将2赋值给b;后一种,b为double型指针变量,b的值为a的首地址,*b会将这块空间的二进制值解释为double型数据。你可以了解下计算机是怎么存储浮点数,你就会发现问题所在了。这里没考虑int与double数据长度问题,根据编译器情况可能会发生越界,我就不详述了。 区别还是比较大的
前者直接把值转换,进行了复制
后者是把指针类型做转换,内存还是a所占用的内存 ,只不过是用long的方式去取值 第一个强转,它的作用在于值,跟类型强转
第二个强转,它的作用在于值跟地址,还有类型强转
页:
[1]