在分析指針數組和數組指針如何訪問二維數組中的各個元素之前,我們要明白二維數組每行的起始地址並不是只能用圖1-5 中的那種表示方式,還有很多方法可以表示每行的起始地址,如*(arr+i) 和arr+i 等。為了幫助讀者更好地記憶,我們通過下面一段代碼來學習其他表示二維數組每行起始地址的方式。
#include <stdio.h>
void main(int argc,char *argv[])
{
int arr[4][4]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i;
for(i=0;i<4;i++)
{
printf("使用arr+i求得二維數組arr第%d行的起始地址為:%d\n",i+1,arr+i);
printf("使用arr[i]求得二維數組arr第%d行的起始地址為:%d\n",i+1,arr[i]);
printf("使用*(arr+i)求得二維數組arr第%d行的起始地址為:%d\n",i+1,(arr+i));
printf("使用&arr[i]求得二維數組arr第%d行的起始地址為:%d\n",i+1,&arr[i]);
printf("\n");
}
return;
}
fengpeng@ubuntu:~/workspace/work1$ ./test 使用arr+i 求得二維數組arr 第1 行的起始地址為:1244996 使用arr[i] 求得二維數組arr 第1 行的起始地址為:1244996 使用*(arr+i) 求得二維數組arr 第1 行的起始地址為:1244996 使用&arr[i] 求得二維數組arr 第1 行的起始地址為:1244996 使用arr+i 求得二維數組arr 第2 行的起始地址為:1245012 使用arr[i] 求得二維數組arr 第2 行的起始地址為:1245012 使用*(arr+i) 求得二維數組arr 第2 行的起始地址為:1245012 使用&arr[i] 求得二維數組arr 第2 行的起始地址為:1245012 使用arr+i 求得二維數組arr 第3 行的起始地址為:1245028 使用arr[i] 求得二維數組arr 第3 行的起始地址為:1245028 使用*(arr+i) 求得二維數組arr 第3 行的起始地址為:1245028 使用&arr[i] 求得二維數組arr 第3 行的起始地址為:1245028 使用arr+i 求得二維數組arr 第4 行的起始地址為:1245044 使用arr[i] 求得二維數組arr 第4 行的起始地址為:1245044 使用*(arr+i) 求得二維數組arr 第4 行的起始地址為:1245044 使用&arr[i] 求得二維數組arr 第4 行的起始地址為:1245044 在上面的代碼中,我們使用了4 種方式來獲得每行的起始地址,因此行起始地址的表示方式並不唯一,讀者在使用的時候可以自行選擇。 下面接著講解數組指針和指針數組是如何訪問二維數組的,先看數組指針的訪問方式。因為數組指針指向的是一個有4 個整型元素的數組,所以可以把二維數組arr 看成由4 個元素arr[0],arr[1], arr[2],arr[3] 組成,每個元素都是含有4 個整型元素的一維數組,所以當在代碼中使用p1=arr 的時候,p1 就指向了二維數組的第一行的首地址。在接下來的訪問中,由於p1 指向的類型是int [4],所以從p1 到p1+1 的變化值為44 個字節,即p1+1=1245012。從前面的運行結果中可以發現,p1+1 剛好指向第二行的起始地址。至於為什麼剛好能指向二維數組arr 的第二行的首地址,這個問題將在第4 章進行講解。通過p1+i 剛好能夠取遍每行的起始地址,有了每行的起始地址之後,就可以通過“*(*(p1+i)+j)”來取出二維數組中每行的每一個元素。指針數組的訪問方式要更容易一些,因為定義的指針數組p2 由4 個元素p2[0],p2[1],p2[2], p2[3] 組成,每個元素都是一個整型指針,所以只需要在程序中取出每行的起始地址並放到p2 指針數組對應的元素中,就可以訪問二維數組arr 中的元素了。所以,在程序中使用指針數組和數組指針的時候,必須對它們有清晰的認識,要知道它們的本質是什麼,以及如何使用。