今天上午在自习室复习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++平台实现的机制。