C++平台对指针的处理

今天上午在自习室复习C++时突然想到了一些问题,分享给大家,希望对广大的C/C++初学者有所启迪和收获,下面开始谈谈我的看法与理解。


直接上代码:


#include  <iostream>

using namespace std;

int main()

{

float  f=34.5;

float  *  fPtr=&f;


int* iPtr=(int*)&f;     



cout <<f<<endl;

cout <<"iPtr:"<<iPtr<<"=>"<<*iPtr<<endl;

cout <<"fPtr;"<<fPtr<<"=>"<<*fPtr<<endl<<endl;


*iPtr = *fPtr;           


cout <<f<<endl;

cout<<*iPtr<<endl;

cout<<*fPtr<<endl;

cin.get();

}


接下来是运行结果:



        

        首先我想说,在各个变量名下,如f、iPtr等,其内容实质为011000之类的二进制数字,就是说,f、*fPtr都只是名字或者说是标记符号,实质都是名字下的内容。

         

下面开始分析这段代码:


        cout <<"iPtr:"<<iPtr<<"=>"<<*iPtr<<endl;

        由于一开始定义了float 型  f,因此f所属的栈用float型(这里为什么说是float型,下面会进行分析)的0101011...(即34.5)进行填充,而iPtr是指向f这块内存区域的指针,并且iPtr的类型为int(严格意义上讲,指针本身的类型都是一样的,且在32位的机器中都只占4个字节),也就是说*iPtr会以int去解析f下的内容(0101011...),这其实就是C++平台对指针的处理,因为指针本身都是一样的。所以大家会看到1107951616这个数字,实质就是用int型去解析float的结果。

          



        *iPtr = *fPtr;          

              这其实是一个隐式数据转换,意思是把34.5转换成34,再用34覆盖掉当前的f的值。但其实质也体现了C++平台本身对指针的处理:C++平台首先以float把f读出来,即34.5,在进行隐式数据转换,把34.5换转成34,再把34转换为int型的二进制代码赋给f,因此在运行cout <<f<<endl;时会出现一个意想不到的结果(用float去解析int的结果),这里也说明了int 型34的二进制表示和float型34的二进制表示是不一样的。




总结:

如果只学习表面上的语法结构,可能就会对许多实质理解的不透彻,只有把C++平台和语法剥离开来才能更好地去理解C++平台实现的机制。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值