关于引用的讨论

来源:互联网 发布:编辑网络大赛 编辑:程序博客网 时间:2024/05/01 03:40

郑飞龙 17:17:04


    
这个是一道面试题,不知道这题是什么意思?
beyond(jzk) 17:19:55
我也弄不明白...
beyond(jzk) 17:20:15
我感觉输出应该是false true

郑飞龙 17:20:45
答案就是这样
郑飞龙 17:20:49
你是怎么看出来的
beyond(jzk) 17:22:43
float 1.0f = 0x37ff..反正是浮点数的表示..
float 0.0 =0.
beyond(jzk) 17:24:41
1.0=3f80000h

郑飞龙 17:24:48
恩,内存中好像就是这样的
beyond(jzk) 17:24:49
0.0=00000000
beyond(jzk) 17:25:22
(int)a = ftoi(a)=1.

郑飞龙 17:25:38
恩,后面的呢
beyond(jzk) 17:25:54
(int&)a=0x3f800000

郑飞龙 17:26:23
为什么(int &)a
郑飞龙 17:26:46
就是你说的那个值呢
beyond(jzk) 17:27:03
我感觉(int &)a=(int)(int*)a

郑飞龙 17:27:19
这个意思是不是相当与把一个浮点数当作整形给输出了
beyond(jzk) 17:27:40
(int)a这个比较明显=1.

郑飞龙 17:27:49
恩,这个比较明显
beyond(jzk) 17:28:41
(int&)a我理解的就是把a的内容也就是0x3f800000转换成一个地址=0x3f800000
beyond(jzk) 17:30:38
这个题应该是考的浮点数的内存表示吧..

郑飞龙 17:31:10
int & r = (int &)a;
郑飞龙 17:31:32
那么这里的r应该怎么理解?
郑飞龙 17:32:04
r 是你刚才说的那个地址是对应的
郑飞龙 17:33:00
cout<<r,相当于输出了0x3f800000单元的内容?
beyond(jzk) 17:33:24
..我看晕了..

郑飞龙 17:36:21
但是我输出r,r的值还是0x3f800000
beyond(jzk) 17:36:23
哪个公司的面试题

郑飞龙 17:36:44
EMC
郑飞龙 17:36:51
易安信
beyond(jzk) 17:37:30
如果输出是0x3f800000的话,那应该得有一个中间变量..
beyond(jzk) 17:37:53
你调试看一下..

郑飞龙 17:38:12
你说的中间变量,指的是什么 ?
beyond(jzk) 17:39:10
(int&)a,不然r引用的地址在哪里..
beyond(jzk) 17:40:41
你看看(int&)a 是不是等于(int)(int*)a

郑飞龙 17:40:50
我调试的时候看,VC好像给r开了一个空间,那个空间存的内容就是a变量的地址。
beyond(jzk) 17:41:34
那样的话,r就是一个指针了..

郑飞龙 17:42:07
我估计底层都是这样实现的
beyond(jzk) 17:42:20
可能吧..
beyond(jzk) 17:43:08
再遇到这种题,可以现根据自己的理解解答..

郑飞龙 17:44:32
调试的时候,&r和a的地址一样,真让人费解
郑飞龙 17:44:42
编译器把我都搞晕了
beyond(jzk) 17:45:37
...

郑飞龙 17:46:09
调试是这样,我晕的不行,实在是理解不了
郑飞龙 17:48:32
算了,太细了,也没什么意思
beyond(jzk) 17:48:37
这样理解你看行不行,反正引用肯定对应一个变量..

郑飞龙 17:48:48

beyond(jzk) 17:49:15
对于int& r=(int&)a.这个句子里面只有一个变量a

郑飞龙 17:49:23

beyond(jzk) 17:49:52
所以r应该是a的地址别名..

郑飞龙 17:50:01

beyond(jzk) 17:50:08
a的地址里放的是0 3f800000
beyond(jzk) 17:50:19
0x3f800000

郑飞龙 17:50:56

beyond(jzk) 17:51:29
不管a是什么类型,他地址里的16进制内容是一样的..

郑飞龙 17:51:42

beyond(jzk) 17:52:42
只是因为引用的类型是int型的,所以输出的是3f800000的int型值..
beyond(jzk) 17:54:00
float& m=(float&)a;
beyond(jzk) 17:55:37
(float&)a==a

郑飞龙 17:56:01
恩,我明白了一点
beyond(jzk) 17:56:41
(int&)a==*(int*)&a





(int&)a 是取地址,地址类型转换,取内容的简写形式.相当于*(int*)&a;

不管a是什么类型 (int&)a==*(int*)&a这个等式都成立

float a=1.0f;
int& r=(int&)a;这一句是后,r是一个指向a地址的int型引用,输出r相当于输出a地址的整形内容
对于这个例子
cout<<r<<endl;
的结果为0x3f800000.

原创粉丝点击