為了更好的理解二維數(shù)組指針,首先我們先來(lái)理解一維數(shù)組(多維數(shù)組的理解以此類推)。
定義一個(gè)一維的數(shù)組?int kk[3] = {1, 2, 3};
這時(shí)候?qū)τ趉k這個(gè)變量怎么理解呢?因?yàn)閗k表示一個(gè)數(shù)組,且數(shù)據(jù)類型為int,所以這是一個(gè)int?類型的數(shù)組指針。數(shù)據(jù)成員的存儲(chǔ)結(jié)構(gòu)如下:

數(shù)據(jù)成員在內(nèi)存當(dāng)中是連續(xù)存儲(chǔ)的,具體占位多少個(gè)字節(jié),跟數(shù)據(jù)成員的類型相關(guān)。
kk既是數(shù)組的地址,同時(shí)也等于該數(shù)組第一個(gè)成員(這里是整數(shù)1)的地址。即 kk = &kk[0]
通過(guò)數(shù)組下標(biāo)序號(hào)訪問(wèn)該數(shù)組不同位置的成員。比如要獲取數(shù)組kk第二個(gè)成員,kk[1],該成員的地址可以表示為&kk[1],?也可以寫作 kk + 1(kk?是第一個(gè)成員的地址, +1表示向后跳一個(gè)數(shù)組成員尋址,具體跳多少個(gè)字節(jié),跟成員數(shù)據(jù)類型相關(guān),在這里+1是跳過(guò)4個(gè)字節(jié)找到kk[1])
接下來(lái)我們看二維數(shù)組
定義一個(gè) 2 *2的二維數(shù)組 int gg[2][2] = { {1, 2}, [3, 4]};
怎么理解這個(gè)二維數(shù)據(jù)呢,首先我們看下圖:

在我們的視覺(jué)理解,這個(gè)gg應(yīng)該是長(zhǎng)得跟圖中a一樣,2*2的數(shù)組,然而從計(jì)算機(jī)存儲(chǔ)角度理解,二維數(shù)組實(shí)際上是圖中b。所以二維數(shù)組實(shí)際上也是一個(gè)數(shù)組,不過(guò)它存儲(chǔ)的對(duì)象是數(shù)組,而不是一維數(shù)組里面具體的數(shù)值。我們用什么表示一個(gè)數(shù)組?數(shù)組指針,所以二維數(shù)組是一個(gè)存儲(chǔ)數(shù)組指針的數(shù)組。數(shù)組名gg也是該數(shù)組的地址,且根據(jù)二維數(shù)組的存儲(chǔ)結(jié)構(gòu),有g(shù)g = *gg = &gg[0][0],雖然三者的數(shù)值相同,但是三者的含義是不同的
gg?表示二維數(shù)組的地址
*gg?前面說(shuō)了二維數(shù)組是數(shù)組的集合,我們用指針表示數(shù)組,所以也可以二維數(shù)組是數(shù)組指針的集合,對(duì)二維數(shù)組指針取消引用(*),得到的是其成員(數(shù)組指針) 。gg + 1 是該二維數(shù)組第二個(gè)成員,gg + 1跟gg[1]等價(jià),不只是數(shù)值上相等
&gg[0][0]? 這個(gè)很好理解,是先獲取二維數(shù)組的第一個(gè)數(shù)組成員的第一個(gè)成員,然后再取址
所以,用一維數(shù)組的相關(guān)概念去類推二維數(shù)組的一些變量,就很好理解和區(qū)分了。
最后通過(guò)例題加深理解:
遍歷二維數(shù)組gg的所有成員內(nèi)的數(shù)值
方法1:for(int i = 0; i? < 4; ++i){
? ? ? ? ? ? printf("%d\n", *(*gg + i));
}
方法2:
for(int i = 0; i? < 2; ++i){
? ? ? ? ? ? ? ? for(int j = 0; j < 2; ++j){
? ??????????????????printf("%d\n", (*(gg + i))[j]);
}}
方法3:
for(int i = 0; i? < 2; ++i){
? ? ? ? ? ? ? ? for(int j = 0; j < 2; ++j){
????????????????????printf("%d\n", gg[i][j]);
}}