标题:[求助]指针类型转换引发的问题
只看楼主
老榆树
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-4-27
 问题点数:0 回复次数:8 
[求助]指针类型转换引发的问题

如下代码,本意是想试试指针类型转换后所指向的数据是什么?可是总不是想要的结果,希望高手指点一下!
#include <iostream>
using namespace std;

int main()
{

//如下代码主要证明指针转换,被转换的实数是否变成转换后的类型
float f=12.3f;
float *fptr=&f;
int *q;

q=(int *)&f;//强制转换
cout <<"the *q value is:"<<*q<<endl;
cout <<"the q value is:"<<q<<endl;
cout <<"the fptr value is:"<<fptr<<endl;
return 1;
}
这一段程序是看一本书上写的。完成用整型的指针q指向float型数据f。我本来觉得经过强制转换后,*q中的数据应该是12,但运行结果*q却是一个10位数的整数。但q与fptr的地址完全相同,不知问题出在什么地方?

[此贴子已经被作者于2006-4-27 23:37:46编辑过]

搜索更多相关主题的帖子: 指针类型 int value float 
2006-04-27 19:46
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
我认为
&f内的8个内存空间一起用系统处理
才能出现12.3f
而q只指向了fptr的前半段

至于他的内容是随机数
还是前半段表示fptr内容的整数部分 后半段表小数部分
我还不知道
估计是随机数

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-27 20:46
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
得分:0 
这种显示类型转换的是很危险的,有时错误你根本没地方找原因。
建议:避免使用强制类型转换。我手上有一本书,有这样的例子,有兴趣可以看看:
int *ip;
char *pc = reinterpret_cast<char*>(ip);
程序员必须永远记得pc所指向的真实对象是int型,而非字符数组。任何假设pc是普通字符指针的应用,都有可能带来有趣的运行时错误。例如,下面语句用pc来初始化一个string对象:string str(pc);它可能会引起运行时的怪异行为。这个例子说明了显示强制类型转换是多么的危险。

这个问题关注中

路漫漫其修远兮 吾将上下而求索
2006-04-27 20:55
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 

c++
是个强类型语言
这个绝对要避免
但这个问题
从得出的数来看
应该是随机数
那个数不象2进制和8进制

但按理来说应该和原值有关系呀
gototheworld 你说呢


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-27 21:05
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
得分:0 
hehe
我也不知道
int * q = (int*)&f;
q实际指的对象是float型,而cout <<"the *q value is:"<<*q<<endl;切把他当int,所以这种结果是很难预料,改为cout<<"the *q value is:"<<*(float*)<<endl;就能正确的输出了。

个人小观点:这种问题没必要研究。

路漫漫其修远兮 吾将上下而求索
2006-04-27 22:07
ot1122
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2006-4-20
得分:0 

大哥,你的main()函数是int性的,但是你又没有返回值。

2006-04-27 22:40
老榆树
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-4-27
得分:0 
呵呵,ot1122好眼力。最后漏了一句“return 1;”。
这个问题只想能够弄明白一些,看看是否是书上的一个错误,其实用性并不怎么样。

[此贴子已经被作者于2006-4-27 23:34:35编辑过]

2006-04-27 23:33
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 
你这样做当然错了,对于q=(int *)&f其实并没有进行数据类型转换,而是进行了指针类型转换,&f地址中存放的本来就是以浮点数格式存放的数据,而int型数据存放方法和float类型数据存放方式并不一样,你直接当int型来用当然会错,指针类型强转并不会带来数据类型强转,你可以试试这样:
float f=12.3f;
float *fptr=&f;
int *q;
int x = int(f);//直接对对象进行强转这才是数据内容的强制转换

q=(int *)&x;
cout <<"the *q value is:"<<*q<<endl;
这样*q的输出就是12了


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-04-28 09:31
老榆树
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-4-27
得分:0 
楼上说的有道理,我完全赞成!
指针类型的转换不代表其所指的数据类型转换,由此可见这种转换真没什么实际意义!
2006-04-28 18:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-60675-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.308510 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved