本文主要是介绍深刻理解C语言中的*和、类型转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前两天同学问我一道面试题,如下:
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; //1printf("%f\n",b); //2printf("%f\n",c); //3return 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])
这篇关于深刻理解C语言中的*和、类型转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!