天天看點

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

本節書摘來自異步社群《指針的程式設計藝術(第二版)》一書中的第3章,第3.2節,作者 蔡明志,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

指針的程式設計藝術(第二版)

一維數組與指針的關系前面已經介紹過。一維數組的元素值,可使用[]或一個*得到,假設有一個數組如下:

則(i+2) 或i[2] 或(ptr+2) 或ptr[2],都表示數組某一個元素的值。而二維數組(two dimension array){xe "二維陣列(two dimension)"},則需要兩個,或一個與一個[ ],或兩個[ ],才能得到數組的元素值。其餘的表示法,隻能得到數組元素的位址。

假設一個二維數組的定義如下,

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

其中j是此數組的名稱,表示這個數組第1行第1列元素的位址,而j+1是第2行第1列元素的位址,除此之外

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

j[0]和j[1]等同于j和j+1,表示第1行第1個元素和第2行第1個元素的位址。j和j[0] 雖然表示同一進制素的位址,但兩者對于加1個機關的意思不同。

j+1表示第2行第1個元素的位址,也即是j+1==&j1。而j[0]+1是第1行第2個元素的位址,也就是j[0]+1==&j0,如下圖所示。

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

關于二維數組的每個元素所在記憶體的概念已在第1章讨論過,請參閱範例address2array-5和address2array-10。

接下來,請問j和(j+1)是某個元素的位址,還是某個元素的值呢?答案是某個元素的位址。j與j都表示第1行第1列元素的位址(&j0)。而j+1與(j+1) 都表示第2行第1列元素的位址(&j1),如下圖所示。

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

雖然j與j表示相同的意思,但兩者都加1,表示的意義是不相同的。j+1表示第2行第1列的位址,而 j+1表示第1行第2列元素的位址(&j0)。同理,*(j+1)+1是第2行第1列的元素位址(&j1)。請參閱範例pointerarr2-5。

範例pointerarr2-5

輸出結果

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

從輸出結果可知,每列之間相距8個位元組,因為每列有兩個int的元素。

綜上所述,如果有一個二維數組k,如下所示:

數組的示意圖如下圖所示。

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

如何得到元素值6(位于第2行第3個元素)的位址呢?答案如下:

從&k1可以很清楚地看出,它表示k1元素的位址。*(k+1)和k[1]都表示第2行第1個元素的位址,是以再加2,都可得到第2行第3個元素的位址。

當我們得到元素的位址後,再加上一個*就可以得到該元素的值,是以

 

都可以得到數組第2行第3列的值。由以上的語句,可以推導出以下的公式。

這一公式很容易了解,因為*和[]是互通的。請參閱範例pointerarr2-10。

範例pointerarr2-10

《指針的程式設計藝術(第二版)》一3.2 指針與二維數組

範例程式使用3種方法,得到k1 的位址與數值。要得到k1 的值6,可以使用(k[1]+2)及((k+1)+2)。如果要得到k1 的位址,則可使用&k1、k[1]+2及(k+1)+2,此處以%p輸出數組第2行第3個元素的位址是0022ff58。如果使用%x取代%p,則會省略前面的0。兩者都可以用于輸出記憶體位址。