一維陣列元素的位址大家都比較容易理解,但對於二維陣列,就很容易搞混了.今天我又被這個問題給弄糊塗了,翻了翻老譚的書本,對這個問題有了更深的認識.
首先給出乙個二維陣列a,它的定義為:
int a[3][4] = , , };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],兩者實際上是相同的位置.
書中用乙個軍訓班長和排長點名的問題形象地說明了這類的問題.
乙個排分3個班,每個班站成一行,這樣就相當於乙個二維陣列.為方便比較,班和戰士的序號也從0開始.班長點名以人為單位,從第0個戰士開始,移動一步走過乙個戰士.排長點名以班為單位,檢查該班是否到齊,排長每走一步走過一班的戰士.班長的移動是橫向的,排長的移動是縱向的.班長"指向"戰士,排長"指向"班,班長相當於列指標,排長相當於行指標.
二維陣列元素的位址
一維陣列元素的位址大家都比較容易理解,但對於二維陣列,就很容易搞混了.今天我又被這個問題給弄糊塗了,翻了翻老譚的書本,對這個問題有了更深的認識.首先給出乙個二維陣列a,它的定義為 int a 3 4 a陣列包含3個行元素,a 0 a 1 a 2 而每個行元素又是乙個一維陣列,它包含4個元素.從二維陣...
二維陣列和陣列元素位址
二維陣列和陣列元素的位址 先給出一下定義 int p,a 3 4 1.二維陣列a由若干個以為陣列組成 像上面定義的陣列a,我們可以理解為由a 0 a 1 a 2 三個元素組成,而他們有分別是乙個一維陣列 通過我們前面學過的知識可以知道,陣列名是乙個位址,其值是第乙個元素的位址,而此位址的基型別就是陣...
二維陣列位址
二維陣列定義 int arr 2 3 typedef p arr 3 p q for size t i 0 i 2 i printf n value 1,address 010ff770 value 2,address 010ff774 value 3,address 010ff778 value ...