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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章