回覆列表
  • 1 # 年輪978865

      首先給出一個二維陣列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],兩者實際上是相同的位置.

  • 中秋節和大豐收的關聯?
  • 解釋一下,守分安命,趁吉避兇?