本節書摘來自華章計算機《c++語言導學》一書中的第1章,第1.8節,[美] 本賈尼·斯特勞斯特盧普 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
元素類型為char的數組可以聲明如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwQzY2cTMyUzNjJDOhJDMxkDM1MDM3EjZzczMzADOyYGM0kDNzgDOl9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
類似地,指針可以聲明如下:
https://yqfile.alicdn.com/cb1c2e165d6d5afd2397d5481f7754f1ecc1094c.png
" >
在聲明語句中,[ ]表示“……的數組”,*表示“指向……”。所有數組的下标都從0開始,是以v包含6個元素:v[0]到v[5]。數組的大小必須是一個常量表達式(見1.7節)。指針變量中存放着一個指定類型對象的位址:
在表達式中,前置一進制運算符*表示“……的内容”,而前置一進制運算符&表示“……的位址”。可以用下面的圖形來表示上述初始化定義的結果:
https://yqfile.alicdn.com/86b6db9aa20349861e511600f4defe900834b2d7.png
考慮将一個數組的10個元素拷貝給另一個數組的任務:
https://yqfile.alicdn.com/b188c8f450d33bb47a8a1700b036098475904cb3.png
上面的for語句可以這樣解讀:将i置為0,當i不等于10時,拷貝第i個元素并遞增i。當作用于一個整型變量時,遞增運算符++執行簡單的加1操作。c++還提供了一種更簡單的for語句,即範圍for(range-for)語句,它可以用最簡單的方式周遊一個序列:
https://yqfile.alicdn.com/c2a547f976a322ad625d5ca9f5854e008bf2e2d6.png
上面的第一個範圍for語句可以解讀為“對于v的每個元素,将其從頭到尾依次拷入x并列印”。注意,當我們使用一個清單初始化數組時無需指定其大小。範圍for語句可用于任意的元素序列(見10.1節)。
如果我們不希望把v的值拷貝到變量x中,而隻是令x引用一個元素,則可以編寫如下的代碼:
在聲明語句中,一進制後置運算符&表示“……的引用”。引用類似于指針,唯一的差別是我們無需使用前置運算符*通路所引用的值。同樣,一個引用在初始化之後就不能再引用其他對象了。
當我們指定函數的參數類型時,引用特别有用。例如:
通過把參數類型定義成引用,我們在調用sort(my_vec)函數時就不必把實參拷貝給形參,而是直接在my_vec上執行操作,對它排序。
還有一種情況,我們既不想修改實參的内容,又希望節省參數拷貝的代價,此時可以使用const引用。例如:
函數使用const引用類型的參數是一個非常普遍的現象。
當用于聲明語句時,運算符(如&、*和[])稱為聲明運算符(declarator operator):
我們的目标是確定指針永遠指向某個對象,這樣解引用該指針的操作就是合法的。當确實沒有對象可指或者希望表達一種“沒有可用對象”的含義時(比如在清單的末尾),我們令指針取值為nullptr(“空指針”)。所有指針類型都共享同一個nullptr:
通常情況下,當我們希望指針實參指向某個東西時,最好檢查一下是否确實如此:
有兩點值得注意:一是我們可以使用++把指針移動到數組的下一個元素;二是在for語句中如果我們不需要初始化操作,則可以省略它。
count_x()的定義假定char*是一個c風格字元串(c-style string),也就是說指針指向了一個字元數組,該數組的結尾處是0。
在舊式代碼中,0和null都可以用來替代nullptr的功能。不過,使用nullptr能夠避免混淆整數(如0或null)和指針(如nullptr)。
例子中用到的count_x()函數不必太複雜,我們隻需對nullptr稍做檢查即可。因為在上面的代碼中for語句并沒有執行初始化的部分,是以不妨把它改成更簡單的while語句:
https://yqfile.alicdn.com/8d22d78508b957ca4ebe05197605680536bbedd4.png" >
while語句不斷重複執行,直到它的條件部分變成false為止。
直接把指針作為條件檢驗(如while(p))的效果等同于比較該指針與空指針是否相等(如while(p!=nullptr))。