2 回答

TA貢獻1845條經(jīng)驗 獲得超8個贊
浮點數(shù)如何存放的已經(jīng)有人回答了,我就不再多談。我猜你要問的是,為什么要取地址,又轉(zhuǎn)什么int *類型的指針,再按int去讀這個數(shù)。
首先,什么是指針?
程序設(shè)計的老師給你講的可能是,這個變量的存放位置。那么這個說法有錯嗎?沒有。那么怎么去理解呢?
計算機的程序在運行時都會被操作系統(tǒng)放入內(nèi)存中,無論是程序代碼、程序使用的變量和常量等等,都是在內(nèi)存中的堆棧中。那么內(nèi)存是什么?內(nèi)存是一個按順序編號的存儲單元序列。比方說,如果我要將一個整形數(shù)(integer)存在內(nèi)存中,那么它要占據(jù)4個存儲單元(每個單元大小為一個字節(jié),即8個比特位),所以我們說int長度是4。同樣的,其他類型的數(shù)據(jù)也有對應(yīng)的長度,比如說double類型數(shù)據(jù)長度為8。
那么內(nèi)存中不可能只放一個數(shù)據(jù)呀,放置多個數(shù)據(jù)之后,我怎么找到想要的變量位置呢?
很容易想到的方法是,我記一下變量起始位置就可以了。比如說我記錄一個雙精度浮點數(shù)(double)類型數(shù)據(jù),我只需要記錄他起始位置(假設(shè)是12),那我從12開始往后讀8個字節(jié)的內(nèi)存單元,我就可以讀出我想要的變量值了。那么,這個12是什么呢?這個12是變量位置,我們給他一個更優(yōu)雅的名稱:指針。
接下來,指針本身只是一個地址,也就是只是一個數(shù)。既然是數(shù),那么也必須是存放在內(nèi)存中的——計算機不能存在寄存器里面啊。所以說指針也是一個變量,在默認(rèn)情況下,它和其他變量也沒有什么本質(zhì)的不同。計算機只知道這里存了個數(shù),它不會管是表示一個地址,或是人類所需要的存放位置。
那么既然是存放位置,我們?yōu)槭裁催€要去定義不同的指針類型呢?比方說我告訴你內(nèi)存位置為12的地方存一個變量,那么怎么去讀取這個變量的值呢?我是按4個字節(jié)還是8個字節(jié)去讀呢?所以要顯示地說明變量類型是什么(int還是double),所以這個指針的值為12,但是類型是int*還是double*還是要手動指定。
但是不管是哪種類型的指針(哪怕是結(jié)構(gòu)體類型的指針),它們長度都是一樣的(int *的長度和double *長度一樣)。所以我們可以強行把一個double*類型按照int*類型來讀。舉例說,我在內(nèi)存空間12-19存放了一個double類型的數(shù),但是我從12開始只讀4個字節(jié),把它理解為一個int,當(dāng)然也是可以的。(這就是題目中這個語句的含義)
所以結(jié)果為什么是0呢,我們只讀了12-15這4個字節(jié)的存儲內(nèi)容,它和原來的長度為8的數(shù)也沒有什么關(guān)系了(畢竟int和double存放方式不一樣)。所以我們要先把double怎么存放在12-19搞明白,找到其中12-15存放的內(nèi)容,然后再把這4個數(shù)“斷章取義”地拼在一起當(dāng)成一個整形數(shù)。(在這里,結(jié)果就是0了)

TA貢獻1810條經(jīng)驗 獲得超4個贊
- 2 回答
- 0 關(guān)注
- 1411 瀏覽
添加回答
舉報