首先,我要說明的,在c語言中,把「多維陣列」叫做「陣列的陣列」更好理解一下。(下面我就統一稱之為「陣列的陣列」)
有的教程中喜歡將陣列的陣列用矩陣表示,不過我更趨向於直線表示,如下圖(定義陣列的陣列int ga[2][3][5])
我對陣列的陣列的理解(以ga[2][3][5]為例): 即為陣列的陣列,陣列裡面包含陣列,陣列作為另乙個陣列的元素。
int ga[2][3][5] =
= ,}
= ,,
...(此處省略3個,上下乙個6個(ga_3[0]~ga_3[4])的)
}; //可能這種表達有點問題!!!歡迎指出 :)
首先,我們看一下指標和一維陣列的關係:
int one[5] = ;
int *p1=one; //一維陣列就是這樣子的,沒錯吧?
然後,再來看看指標與二維陣列的關係:
int two[3][5] = ;
int (*p2)[5] = two; //注意和上述一維陣列的關係和區別噢!
最後我們看看指標與三位陣列的關係:
int three[2][3][5] = ;
int (*p3)[3][5] = three; //這下你應該總結出來了一點規律了吧?
是的,四維陣列、五維陣列、...差不多都是這樣子的。
下面開始解釋其原因:(請始終牢記「多維陣列」即是「陣列的陣列」)
1、上述三維陣列中的ga[2]可以看作一維陣列ga_1[2],其元素是ga_1[0],ga_1[1]。
2、ga_1[0]又是乙個陣列,其元素是ga_2[0],ga_2[1],ga_2[2],亦即是ga_1[0]可以表示為ga_1[0][3],同理有ga_1[1][3](請注意顏色!);
3、當然ga_2[0] 亦可以表示為ga_2[0][5],同理...;
4、總結的表示式就為上述很長的那個連等式;
5、還有問題需要注意,就是分割出來的子陣列的首指標是指向什麼位置的;
5、不知道我解釋的對不對,您能看懂麼? 歡迎指出錯誤!!!
既然上面有指標p1,p2,p3與陣列有關聯了,那麼現在開始用指針對陣列元素訪問:
p1:for
(inti=
0; i
<
5; i++)
printf(
"one[%d] = %d\n
", i, *(p
+i));
p2:inti=
0,j=0
;for
(; i
<
3; i++)
for(j=0
; j<
5; j++)
printf(
"two[%d][%d] = %d\n
", i, j, *(
*(p2+i)
+j));
p3:inti=
0,j=0
,k=0;
for(; i
<
2; i++)
for(j=0
; j<
3; j++)
for(k=0
; k<
5; k++)
printf(
"three[%d][%d][%d] = %d\n",
*(*(
*(p3+i)
+j)+k));
另外需要注意的是:
1、在*(*(*(p3+i)+j)+k)中,當執行「p3+i」的時候陣列步長為「4*3*5=60」,當執行「...+j」的時候步長為「4*5=20」,當執行「...+k」的時候步長為「4」,這裡的「4」都是指int型別所在位元組數。(關於陣列步長的概念,請大家查閱其相關資料。)
2、int (*r)[5] = ga[1]中g[1]指的是第二個ga_2[0]位址,亦即是ga[2][3][5]被看作ga_2[2]了;
int *t = g[1][1]中g[0][0]指的是第二個ga_2[1]位址,亦即是ga[2][3][5]被當作ga_1[2][3]了。
(這點可能有點難理解,建議上機操作一次。)
ps:貌似用指標和下標訪問的多位陣列的效率是一樣的,到底使用那種方式看自己對其掌握的熟練程度。但是二者所代表的含義不一樣,請參考本博博文: 中第三篇模版裡提到的內容。
指標 多維陣列 陣列指標 指標陣列
之前對陣列的概念一直沒有理解透徹,只覺得陣列名就是個常量指標而已,用法和基本的指標差不多。所以當我嘗試用二級指標去訪問二維陣列時,就經常會出錯。下面就是剛開始寫的乙個錯誤的程式 include int main int parray null parray iarray printf array 0...
多維陣列(陣列型別,陣列指標,陣列指標型別)
陣列 int myarray100 myarray是陣列首元素位址,myarray 1 步長是四個位元組 sizeof int myarray是整個陣列的位址,myarray 1 步長是100 sizeof int 400個位元組 typedef int myarraytype 100 myarra...
c中多維陣列及陣列指標的理解
c和指標 第八章第四題 對於可指定尺寸的陣列,判斷其是否為單位矩陣。背景介紹 1.多維陣列做形參 矩陣需要用二維陣列表示,二維陣列作為形參可用以下兩種形式 void func int matrix 10 void func int matrix 10 必須指定第二維的具體數字,不可以用void fu...