Posted on 2013-01-29 17:14
點(diǎn)點(diǎn)滴滴 閱讀(2324)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
02 編程語(yǔ)言
摘要:在C/C++學(xué)習(xí)過(guò)程中,尤其是C學(xué)習(xí)到中階之后,可能會(huì)由遇到把指針轉(zhuǎn)換為整數(shù)或把整數(shù)轉(zhuǎn)換指針的過(guò)程,第一次接觸的人可能會(huì)有疑問(wèn),本文的目的就是解決這個(gè)疑問(wèn)。
問(wèn)題
在C/C++代碼遇到下面這些表達(dá)式:
//把一個(gè)整數(shù)賦值給一個(gè)指針
char* p_0=0;
int* p_1=(int*)569;
//把一個(gè)指針賦值給整數(shù)
unsigned int n_0=(unsigned int)p_1;
unsigned int n_1=(unsigned int)p_0;
我們的問(wèn)題是,為什么這些是正確的,甚至有時(shí)不很常見(jiàn)的。答案
要回答這個(gè)問(wèn)題,我們需要回到二進(jìn)制以及位模式的解釋,或者內(nèi)存地址定位方法上。我們先從內(nèi)存地址定位方法上開(kāi)始。
現(xiàn)在的系統(tǒng)是很復(fù)雜的軟件系統(tǒng)和硬件系統(tǒng)的組合,我們的應(yīng)用程序運(yùn)行在操作系統(tǒng)之上,操作系統(tǒng)為應(yīng)該程序提供了一層透明的內(nèi)存訪問(wèn)和使用機(jī)制:內(nèi)存就是一個(gè)很大的字節(jié)數(shù)組,它通過(guò)數(shù)組的下標(biāo)索引來(lái)定位。這里所講的機(jī)制,實(shí)際上就是虛擬內(nèi)存技術(shù),廣泛地存在于現(xiàn)在的操作系統(tǒng)之中。
明白內(nèi)存就是一個(gè)大數(shù)組之后,那么就不難理解指針與整數(shù)的互換了,因?yàn)橐粋€(gè)指針變量的值就是一個(gè)地址,那么這個(gè)地址實(shí)際上就是內(nèi)存那個(gè)大數(shù)組的下標(biāo),下標(biāo)是什么?下標(biāo)就是整數(shù),如此指針與整數(shù)之間的轉(zhuǎn)換是正常的,并且在更底層的代碼中,我們會(huì)見(jiàn)到指針與整數(shù)就是一個(gè)東西,但在C/C++這樣認(rèn)為就不合適了。
讓我們來(lái)考慮二進(jìn)制,這里說(shuō)到一些比較接近機(jī)器的概念,不明白可以跳過(guò)。二進(jìn)制就是0或1的串,好比“001101”這樣的。一個(gè)整數(shù)可能由一個(gè)“01101”組成,這里它是25;那么一個(gè)指針也可能由一個(gè)“01101”組成,此時(shí)它代表什么呢?此時(shí)它代表內(nèi)存中被編號(hào)為25的那個(gè)字節(jié)。這樣的看到了,同樣一個(gè)二進(jìn)制串被用于表達(dá)不同的意義,這就是計(jì)算的偉大之處,它把相同的位模式放于不同的環(huán)境之中,對(duì)其進(jìn)行不同解釋,從而產(chǎn)生千差萬(wàn)別的意義。有一句話是這樣說(shuō)的:信息=位+上下文,想要表達(dá)的意思就是這個(gè)。
總結(jié)一下,整數(shù)與指針可以相互轉(zhuǎn)換的原因是:內(nèi)存是一個(gè)大數(shù)組,此外更深刻的原因是,對(duì)于人來(lái)說(shuō)一個(gè)整數(shù),一個(gè)是指針,但對(duì)于機(jī)器來(lái)說(shuō),它們都是二進(jìn)制位。