C#數(shù)組和指針全面討論
C#有很多值得學(xué)習(xí)的地方,這里我們主要介紹C#數(shù)組和C#指針,包括介紹為什么C#語(yǔ)言把數(shù)組形參當(dāng)作指針等方面。
什么時(shí)候C#數(shù)組和C#指針相同
所有作為函數(shù)參數(shù)的數(shù)組名總是可以通過編譯器轉(zhuǎn)換為指針。在其他所有情況下,數(shù)組的聲明就是數(shù)組,指針的聲明就是指針,兩者不能混淆。但在語(yǔ)句或表達(dá)式中引用時(shí),數(shù)組總是可以寫成指針的形式,兩者可以互換。然而,C#數(shù)組和C#指針在編譯器處理時(shí)是不同的,在運(yùn)行時(shí)的表示形式也是不一樣的。對(duì)編譯器而言,一個(gè)數(shù)組就是一個(gè)地址,一個(gè)指針就是一個(gè)地址的地址,你應(yīng)該根據(jù)情況做出選擇。
為什么會(huì)發(fā)生混淆
當(dāng)人們學(xué)習(xí)編程時(shí),一開始總是把所有的代碼都放到一個(gè)函數(shù)里。隨著水平的進(jìn)步,他們把代碼分別放在幾個(gè)函數(shù)中。在水平繼續(xù)提高后,他們最終學(xué)會(huì)了如何用幾個(gè)文件來構(gòu)造一個(gè)程序。
什么時(shí)候C#數(shù)組和C#指針是相同的?C#語(yǔ)言標(biāo)準(zhǔn)對(duì)此作了如下說明:
規(guī)則1 表達(dá)式中的數(shù)組名(與聲明不同)被編譯器當(dāng)作一個(gè)指向該數(shù)組***個(gè)元素的指針。
規(guī)則2 下標(biāo)總是與指針的偏移量相同。
規(guī)則3 在函數(shù)參數(shù)的聲明中,數(shù)組名被編譯器當(dāng)作指向該數(shù)組的***個(gè)元素的指針。
規(guī)則1:“表達(dá)式中的數(shù)組名”就是指針
規(guī)則1和2合在一起理解,就是對(duì)數(shù)組下標(biāo)的引用總是可以寫成“一個(gè)指向數(shù)組的起始地址的指針加上偏移量?!保▊€(gè)人認(rèn)為,表述為“一個(gè)指向該數(shù)組***個(gè)元素的指針加上偏移量”更明確。)
對(duì)數(shù)組的引用如a[i]在編譯時(shí)總是被編譯器改寫成*(a+i)的形式。C#語(yǔ)言標(biāo)準(zhǔn)要求編譯器必須具備這個(gè)概念性的行為。于是,a[6]和6[a]都是正確的。
編譯器自動(dòng)把下標(biāo)值的步長(zhǎng)調(diào)整到數(shù)組元素的大小。這就是為什么指針總是有類型限制,每個(gè)指針只能指向一種類型的原因,因?yàn)榫幾g器需要知道對(duì)指針進(jìn)行解除引用操作時(shí)應(yīng)取幾個(gè)字節(jié),以及每個(gè)下標(biāo)的步長(zhǎng)應(yīng)取幾個(gè)字節(jié)。
規(guī)則2:C#語(yǔ)言把數(shù)組下標(biāo)作為指針的偏移量
事實(shí)上,下標(biāo)范圍檢測(cè)被認(rèn)為并不值得加入到C#語(yǔ)言中。數(shù)組下標(biāo)是定義在指針的基礎(chǔ)上的,所以優(yōu)化器常??梢园阉D(zhuǎn)換為更有效率的指針表達(dá)式,并生成相同的機(jī)器指令。C#語(yǔ)言把數(shù)組下標(biāo)改寫成指針偏移量的根本原因是指針和偏移量是底層硬件所使用的基本模型。
為什么C#語(yǔ)言把數(shù)組形參當(dāng)作指針
之所以要把傳遞給函數(shù)的數(shù)組參數(shù)轉(zhuǎn)換為指針是出于效率的考慮,這個(gè)理由常常也是對(duì)違反軟件工程做法的辯解。我們傾向于始終把參數(shù)定義為指針,因?yàn)檫@是編譯器內(nèi)部所使用的形式。以上介紹C#數(shù)組和C#指針。
【編輯推薦】