深刻理解C语言中的*和&、类型转换
来源:互联网 发布:steam好玩的mac游戏 编辑:程序博客网 时间:2024/05/01 17:21
前两天同学问我一道面试题,如下:
int a=1;printf("%f",a);
结果输出是0.00000,好像这是和编译器有关系的,我试验在codeblock上,亲测printf("%f",int)都会是0。
后来又试了试别的代码:
#include <cstdio>#include <iostream>using namespace std;int main(){ int a=0x43300000; float b=*(float *) &a; float c=(float)a; cout << (float*) &a << endl; //1 printf("%f\n",b); //2 printf("%f\n",c); //3 return 0;}
这样会输出什么呢?看下图
具体解释:
1指的是先取a的地址,也就是0x6afef4,此时&a就可以看成一个指针*p,p==0x6afef4,不过指向的是int型的,然后(float*)p代表将p指向的地址变为float型,输出的时候还是个float型指针,所以是地址。
2指的是取1中说的float型的指针的内容,但本来是int型的数,按照float型的数来读取就不一样了,因为float型内存中是分为三部分的,符号位、指数位、尾数,具体可以搜一下float内存表示,推荐博客http://blog.csdn.net/nethibernate/article/details/6120382。
3指的是将a中的数据直接类型转换,这时他的数不会变,所以和2不一样。
PS:对*和&的理解
void f(int * a) // a 是一个int型的指针,a指的地址存放的是int型的数据{ a // 取指针a的值(即地址) *a // 取指针a指向的内容 &a // 取存放指针a的值的地址}
如果a是一个数组
&a+1 = a + 1*sizeof(a); //如果数组a有100个数据,哪就移动100*sizeof(a[0])a+1 = a +1*sizeof(a[0]); //仅移动sizeof(a[0])
1 0
- 深刻理解C语言中的*和&、类型转换
- JNI中的类型和c语言中的类型转换
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- C语言 unsigned 和 signed 类型相互转换深入理解
- c语言中的类型转换
- C语言中的类型转换
- c语言中的类型转换
- C语言中的类型转换
- C语言中的类型转换
- C语言中的类型转换
- C语言中的类型转换
- c语言中的类型转换
- C语言中的类型转换!
- C语言中的类型转换
- 简单的php实现单点登录
- JDK和JRE的概念与区别
- Group Anagrams
- Mybatis学习之优化MyBatis配置文件中的配置
- 关于时间的概念
- 深刻理解C语言中的*和&、类型转换
- Unity GameObject对象的几个重要方法
- PowerDesigner教程系列(一)概念数据模型
- linux下syscall函数,SYS_gettid,SYS_tgkill
- 解决eclipse中java代码注释变成乱码的问题
- 【bzoj4562】[Haoi2016]食物链
- JAVA --面向对象
- webstorm 2016.2.3、webstorm 2016.2.4 激活破解
- Java动态生成组件