深刻理解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;       //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])


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值