二維數組的原理與指針運算的原理

上次梳理了一維數組的與指針的原理以及它們的關係,我們再來看看二維數組。

當我們定義一個二維數組時,實際上佔用的是內存中連續的線性空間。

倘若我們定義整形的二維數組:int b[2][3],實際上它在內存中佔用連續6個整形元素的空間。而且是3個元素一組,形成2組一維數組。

這句話的意思是,二維數組b[2][3]可以看作包含兩個元素的一維數組,而每個元素又恰好包含3個整形的元素,恰好也是一維數組。

根據這個原理,我們可以 將二維數組看作是嵌套的一維數組,即分作外層一維數組與內層一維數組。

同理,既然是一維數組,就有內嵌的特殊指針。

外層的一維數組我們可以看作是b[2],它具有特殊的指針b,指針地址是一維數組b首個元素b[0]的地址,即&b[0],指針b存取着數組首個元素b[0]的地址,所以b == &b[0];

既然存在指針,當然可以進行指針運算,同一維數組,我們對指針b進行指針運算也是對指針b存取的地址進行更改,只是…指針b每+1,地址加多少位呢?我們定義的數組數據類型爲整形,可我們這個“特殊”的外層一維數組每一元素佔用地址不是一整形地址,而是3整形地址。即3*4 = 12 字節。

所以,當我們對b進行指針運算時,得出的地址是下一個包含3個整形元素的元素的地址,即外層一維數組下一個元素的地址。

說完了外層的一維數組,我們再來看內層的一維數組。

內層的一維數組與普通一維數組無異,均由存取着數組首元素地址的指針進行服務,這個指針沒有名字,它的地址也是數組首元素的地址,若是第一個內層一維數組,指針的地址即&b[0][0],若是第二個內層一維數組,指針的地址是&b[1][0]。

開始我們說過,地址的表示與劃分是從內存中首個元素頭部開始的, 在我們定義的整形數據類型這裏,開始處就是這段連續的線性空間首個整形元素的地址。然後這就解釋了爲什麼外層的一維數組指針的地址與內層第一個一維數組的指針的起始地址是相同的。其實他們各自的指針存取的地址都是同一塊內存的地址。

我們對內存的一維數組的指針進行指針運算時,每次運算都是對所存地址的更改,因爲是整形元素,所以每單位運算更改是四個字節,對內層指針的運算結束之後再進行解引用,就可以精確的拿到整形元素所存取的數據。

以上是外層數組和內層數組各自指針運算的原理,我們如何控制指針呢?

其實玄機就在於指針他存的就是地址!!

譬如,我們想拿外層數組第二個元素內的第三個數組元素存取的值,即b[1][2]。

當我們對外層一維數組進行指針運算時,我們可以寫作(b + 1)(不要忘記前面說的,外層一維數組的指針有名字的,內層一維數組的指針沒有!),它表示指針b中存取的地址突然增加了12字節(如果沒明白,往上看),好,本來指針b存取的是外層數組元素的首地址現在了突然增加了12字節,正好是外層一維數組第二個元素的起始處!OK,我們的b指針進行了指針運算,現在我們的指針b拿到了外層一維數組第二個元素的地址。

可你別忘了,外層數組第二個元素也是一個具有三個整形元素的一維數組啊!外層數組的第二個元素的地址正是內層一維數組內嵌指針的的地址,也是指針存取的地址。 所以我們上面進行的操作實則是拿到了第二個內層一維數組指針的地址!

那如何將控制權從外層數組的指針轉移到內層數組的指針呢?
就是對拿到的數據進行解引用。

不要忘了,因爲內層指針也是具有地址的,我們剛剛對外層指針b+1運算之後拿到的地址就是外層第二個元素的地址就是其內層一維數組的首個元素的地址就是其指針的地址就是其指針保存的地址。 當我們對已運算指針(b+1)獲取的數據(這個數據就是外層數組第二個元素的地址,就是其內層一維數組指針的地址~)進行解引用, 就是找到運算之後外層指針b存放的地址對應的元素的內容,取得的仍然是一個地址(因爲第二個外層元素的地址就是其內層一維數組指針的地址,解引用是按地址尋對應上地址的元素的數據,那麼尋址就會找到內層指針的數據,而內層指針存取的地址又是與自身地址相同,所以取得的還是地址~),這個地址就是第二個內層一維數組的指針存取的地址(同樣的此指針存取的地址與其指針本身的地址相同),

結果就是 *(b+1) 之後取得的不是數據,而是一個指針存取的地址, 所以,我們成功獲取了內層一維數組指針的存取的地址。

這又來到了內層一維數組的指針運算操作,此時再對指針進行指針運算,就是對解引用之後的 (b+1)(解引用之後是個地址~)進行運算: (*(b+1)+2) 得到我們想取得的元素的地址,此時對指針再次解引用, 按地址尋數據:*(*(b+1)+2) 就可取得指針所存地址對應元素的元素的內容了,這時就是一個數據了。

我們發現,二維數組指針操作的過程中,外層指針存取的地址對應的元素不是數據,而是地址(是一個指針)。即對指針的地址解引用一次仍然得到一個指針的地址(仍需第二次解引用),這種指針指向指針的的特點,稱爲二級指針。

實際上,一維數組是用一級指針進行操作的,而二維數組是用二級指針來進行數據的操作的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章