1. 程式人生 > >二維數組元素的地址

二維數組元素的地址

mage src com 數組 分析 容易 color [1] 指向

  一維數組元素的地址大家都比較容易理解,但對於二維數組,就很容易搞混了.今天我又被這個問題給弄糊塗了,翻了翻老譚的書本,對這個問題有了更深的認識.

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

  書中用一個軍訓班長和排長點名的問題形象地說明了這類的問題.

  一個排分3個班,每個班站成一行,這樣就相當於一個二維數組.為方便比較,班和戰士的序號也從0開始.班長點名以人為單位,從第0個戰士開始,移動一步走過一個戰士.排長點名以班為單位,檢查該班是否到齊,排長每走一步走過一班的戰士.班長的移動是橫向的,排長的移動是縱向的.班長"指向"戰士,排長"指向"班,班長相當於列指針,排長相當於行指針.

技術分享

二維數組元素的地址