深刻理解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
原创粉丝点击