首先給出一個二維陣列a,它的定義為:
int a[3][4] = {{1,3,5,7}, {9,11,13,15}, {17,19,21,23}};
a陣列包含3個行元素,a[0],a[1],a[2].而每個行元素又是一個一維陣列,它包含4個元素.
從二維陣列的角度來看,a代表二維陣列首元素的地址,現在的首元素不是簡單的整型,而是由4個整型元素所組成的一維陣列,因此a代表的是首行(序號為0的行)的首地址.同理,a+1代表序號為1的行的首地址.如果二維陣列的首行的首地址為2000,一個整型資料佔4個位元組,則a+1的值應該是2000+4*4=2016,a+1指向a[1],或者說a+1是a[1]的首地址,*(a+1)等價於a[1].如下圖
a[0],a[1],a[2]既然是一維陣列名,則a[0]代表一維陣列a[0]中第0列元素的地址,即&a[0][0];同理a[1]的值是&a[1][0],a[2]的值是&a[2][0];
那麼a陣列0行1列元素的地址怎麼表示呢?a[0]是一維陣列名,該一維陣列中序號為1的元素的地址顯然應該用a[0]+1來表示,如下圖.
(a+i)表示的是行指標,a[i]+j表示列指標;
前已敘述,a[0]和*(a+0)等價,a[i]和*(a+i)等價.因此a[0]+1和*(a+0)+1都是&a[0][1].進一步分析,a[0][1]的值則為*(a[0]+1),*(*(a+0)+1)或者*(*a+1).
通用的表示:*(a[i]+j),*(*(a+i)+j)是a[i][j]的值.可以這樣理解:行指標a縱向移動i到達到a+i,然後解引用得到*(a+i),即a[i]——列指標,然後列指標a[i]橫向移動j步到達(a[i]+j)),最後解引用得到*(a[i]+j),即a[i][j];
更多例子參見下表.
一個有趣的現象是a+1和*(a+1)都是2016,其實不難理解,它們都是地址,a+1指向a中序號為1的行的首地址,而*(a+1)是a[1],指向的是a[1][0],兩者實際上是相同的位置.
首先給出一個二維陣列a,它的定義為:
int a[3][4] = {{1,3,5,7}, {9,11,13,15}, {17,19,21,23}};
a陣列包含3個行元素,a[0],a[1],a[2].而每個行元素又是一個一維陣列,它包含4個元素.
從二維陣列的角度來看,a代表二維陣列首元素的地址,現在的首元素不是簡單的整型,而是由4個整型元素所組成的一維陣列,因此a代表的是首行(序號為0的行)的首地址.同理,a+1代表序號為1的行的首地址.如果二維陣列的首行的首地址為2000,一個整型資料佔4個位元組,則a+1的值應該是2000+4*4=2016,a+1指向a[1],或者說a+1是a[1]的首地址,*(a+1)等價於a[1].如下圖
a[0],a[1],a[2]既然是一維陣列名,則a[0]代表一維陣列a[0]中第0列元素的地址,即&a[0][0];同理a[1]的值是&a[1][0],a[2]的值是&a[2][0];
那麼a陣列0行1列元素的地址怎麼表示呢?a[0]是一維陣列名,該一維陣列中序號為1的元素的地址顯然應該用a[0]+1來表示,如下圖.
(a+i)表示的是行指標,a[i]+j表示列指標;
前已敘述,a[0]和*(a+0)等價,a[i]和*(a+i)等價.因此a[0]+1和*(a+0)+1都是&a[0][1].進一步分析,a[0][1]的值則為*(a[0]+1),*(*(a+0)+1)或者*(*a+1).
通用的表示:*(a[i]+j),*(*(a+i)+j)是a[i][j]的值.可以這樣理解:行指標a縱向移動i到達到a+i,然後解引用得到*(a+i),即a[i]——列指標,然後列指標a[i]橫向移動j步到達(a[i]+j)),最後解引用得到*(a[i]+j),即a[i][j];
更多例子參見下表.
一個有趣的現象是a+1和*(a+1)都是2016,其實不難理解,它們都是地址,a+1指向a中序號為1的行的首地址,而*(a+1)是a[1],指向的是a[1][0],兩者實際上是相同的位置.