天天看點

《c++語言導學》——1.8 指針、數組和引用

本節書摘來自華章計算機《c++語言導學》一書中的第1章,第1.8節,[美] 本賈尼·斯特勞斯特盧普 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

元素類型為char的數組可以聲明如下:

《c++語言導學》——1.8 指針、數組和引用

類似地,指針可以聲明如下:

《c++語言導學》——1.8 指針、數組和引用

https://yqfile.alicdn.com/cb1c2e165d6d5afd2397d5481f7754f1ecc1094c.png

" >

在聲明語句中,[ ]表示“……的數組”,*表示“指向……”。所有數組的下标都從0開始,是以v包含6個元素:v[0]到v[5]。數組的大小必須是一個常量表達式(見1.7節)。指針變量中存放着一個指定類型對象的位址:

《c++語言導學》——1.8 指針、數組和引用

在表達式中,前置一進制運算符*表示“……的内容”,而前置一進制運算符&表示“……的位址”。可以用下面的圖形來表示上述初始化定義的結果:

《c++語言導學》——1.8 指針、數組和引用

https://yqfile.alicdn.com/86b6db9aa20349861e511600f4defe900834b2d7.png

考慮将一個數組的10個元素拷貝給另一個數組的任務:

《c++語言導學》——1.8 指針、數組和引用

https://yqfile.alicdn.com/b188c8f450d33bb47a8a1700b036098475904cb3.png

上面的for語句可以這樣解讀:将i置為0,當i不等于10時,拷貝第i個元素并遞增i。當作用于一個整型變量時,遞增運算符++執行簡單的加1操作。c++還提供了一種更簡單的for語句,即範圍for(range-for)語句,它可以用最簡單的方式周遊一個序列:

《c++語言導學》——1.8 指針、數組和引用

https://yqfile.alicdn.com/c2a547f976a322ad625d5ca9f5854e008bf2e2d6.png

上面的第一個範圍for語句可以解讀為“對于v的每個元素,将其從頭到尾依次拷入x并列印”。注意,當我們使用一個清單初始化數組時無需指定其大小。範圍for語句可用于任意的元素序列(見10.1節)。

如果我們不希望把v的值拷貝到變量x中,而隻是令x引用一個元素,則可以編寫如下的代碼:

《c++語言導學》——1.8 指針、數組和引用

在聲明語句中,一進制後置運算符&表示“……的引用”。引用類似于指針,唯一的差別是我們無需使用前置運算符*通路所引用的值。同樣,一個引用在初始化之後就不能再引用其他對象了。

當我們指定函數的參數類型時,引用特别有用。例如:

《c++語言導學》——1.8 指針、數組和引用

通過把參數類型定義成引用,我們在調用sort(my_vec)函數時就不必把實參拷貝給形參,而是直接在my_vec上執行操作,對它排序。

還有一種情況,我們既不想修改實參的内容,又希望節省參數拷貝的代價,此時可以使用const引用。例如:

《c++語言導學》——1.8 指針、數組和引用

函數使用const引用類型的參數是一個非常普遍的現象。

當用于聲明語句時,運算符(如&、*和[])稱為聲明運算符(declarator operator):

《c++語言導學》——1.8 指針、數組和引用

我們的目标是確定指針永遠指向某個對象,這樣解引用該指針的操作就是合法的。當确實沒有對象可指或者希望表達一種“沒有可用對象”的含義時(比如在清單的末尾),我們令指針取值為nullptr(“空指針”)。所有指針類型都共享同一個nullptr:

《c++語言導學》——1.8 指針、數組和引用

通常情況下,當我們希望指針實參指向某個東西時,最好檢查一下是否确實如此:

《c++語言導學》——1.8 指針、數組和引用

有兩點值得注意:一是我們可以使用++把指針移動到數組的下一個元素;二是在for語句中如果我們不需要初始化操作,則可以省略它。

count_x()的定義假定char*是一個c風格字元串(c-style string),也就是說指針指向了一個字元數組,該數組的結尾處是0。

在舊式代碼中,0和null都可以用來替代nullptr的功能。不過,使用nullptr能夠避免混淆整數(如0或null)和指針(如nullptr)。

例子中用到的count_x()函數不必太複雜,我們隻需對nullptr稍做檢查即可。因為在上面的代碼中for語句并沒有執行初始化的部分,是以不妨把它改成更簡單的while語句:

《c++語言導學》——1.8 指針、數組和引用

https://yqfile.alicdn.com/8d22d78508b957ca4ebe05197605680536bbedd4.png" >

while語句不斷重複執行,直到它的條件部分變成false為止。

直接把指針作為條件檢驗(如while(p))的效果等同于比較該指針與空指針是否相等(如while(p!=nullptr))。

繼續閱讀