浮点数如何存放的已经有人回答了,我就不再多谈。我猜你要问的是,为什么要取地址,又转什么int *类型的指针,再按int去读这个数。
首先,什么是指针?
程序设计的老师给你讲的可能是,这个变量的存放位置。那么这个说法有错吗?没有。那么怎么去理解呢?
计算机的程序在运行时都会被操作系统放入内存中,无论是程序代码、程序使用的变量和常量等等,都是在内存中的堆栈中。那么内存是什么?内存是一个按顺序编号的存储单元序列。比方说,如果我要将一个整形数(integer)存在内存中,那么它要占据4个存储单元(每个单元大小为一个字节,即8个比特位),所以我们说int长度是4。同样的,其他类型的数据也有对应的长度,比如说double类型数据长度为8。
那么内存中不可能只放一个数据呀,放置多个数据之后,我怎么找到想要的变量位置呢?
很容易想到的方法是,我记一下变量起始位置就可以了。比如说我记录一个双精度浮点数(double)类型数据,我只需要记录他起始位置(假设是12),那我从12开始往后读8个字节的内存单元,我就可以读出我想要的变量值了。那么,这个12是什么呢?这个12是变量位置,我们给他一个更优雅的名称:指针。
接下来,指针本身只是一个地址,也就是只是一个数。既然是数,那么也必须是存放在内存中的——计算机不能存在寄存器里面啊。所以说指针也是一个变量,在默认情况下,它和其他变量也没有什么本质的不同。计算机只知道这里存了个数,它不会管是表示一个地址,或是人类所需要的存放位置。
那么既然是存放位置,我们为什么还要去定义不同的指针类型呢?比方说我告诉你内存位置为12的地方存一个变量,那么怎么去读取这个变量的值呢?我是按4个字节还是8个字节去读呢?所以要显示地说明变量类型是什么(int还是double),所以这个指针的值为12,但是类型是int*还是double*还是要手动指定。
但是不管是哪种类型的指针(哪怕是结构体类型的指针),它们长度都是一样的(int *的长度和double *长度一样)。所以我们可以强行把一个double*类型按照int*类型来读。举例说,我在内存空间12-19存放了一个double类型的数,但是我从12开始只读4个字节,把它理解为一个int,当然也是可以的。(这就是题目中这个语句的含义)
所以结果为什么是0呢,我们只读了12-15这4个字节的存储内容,它和原来的长度为8的数也没有什么关系了(毕竟int和double存放方式不一样)。所以我们要先把double怎么存放在12-19搞明白,找到其中12-15存放的内容,然后再把这4个数“断章取义”地拼在一起当成一个整形数。(在这里,结果就是0了)
明白了吗?
请问为什么输出的是0?
追答用整型控制符%d输出浮点数绝大部分会是0,但也有例外。pInt虽然是int *型指针,但它指向的目标是d,d是浮点型,*pInt是目标d。