c语言int *pInt=(int *)&d; 什么意思?

第二个输出的为什么是0?

浮点数如何存放的已经有人回答了,我就不再多谈。我猜你要问的是,为什么要取地址,又转什么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了)

明白了吗?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-10-26

把double变量d的地址强制转换为int 指针赋给int *型指针plnt。

至于输出的是0,这是因为,double是64位二进制值,当用%d格式去输出时,它

只取前面的32位二进制,按int格式去解读它。如果这个double数据的前32个二进制位恰好全是0,这时的输出就变成0了。

第2个回答  2018-10-26
//这句是数值赋值。使用了类型转换,double类型转int类型时,只取double的整数部分。,所以x=100
int x = d;

//这句是指针赋值。double类型的指针,强转为int类型的指针时,其实指针的位置没有变化,但是含义变了;
//double指针表示从指针开始的往后8个字节,存的是double格式;int指针表示从指针开始往后的4个字节,存的是int格式
//那么这里从指针开始往后的4个字节,是什么内容呢?
//d=100.25,对应的16进制是:0x4059 1000 0000 0000
//所以从指针开始往后的4个字节,要么是:4059 1000,要么是:0000 0000。
//这和你系统是大端模式(内存低地址放的是权值高的位),还是小端模式有关(内存低地址放的是权值低的位)。
//你的系统是小端模式的,所以从指针开始往后的4个字节是:0000 0000
//你的系统是大端模式的,所以从指针开始往后的4个字节是:4059 1000
//这了控制台输出了0,所以可以断定,你的系统是小端模式,指针开始往后的4个字节是:0000 0000
int *pInt=(int *)&d;

本回答被提问者采纳
第3个回答  2018-10-26
双精度浮点数100.25在内存中存储编码是(16进制):
0x4059 1000 0000 0000
也就是说低位4个字节都为0,
所以,printf(“%d\n”, *pInt)语句输出0。
第4个回答  2018-10-26
把double型变量d的地址强制为int *型指针赋给int *型指针plnt。追问

请问为什么输出的是0?

追答

用整型控制符%d输出浮点数绝大部分会是0,但也有例外。pInt虽然是int *型指针,但它指向的目标是d,d是浮点型,*pInt是目标d。

相似回答