二維陣列元素的位址

2021-08-22 05:00:11 字數 1499 閱讀 7031

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

首先給出乙個二維陣列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[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 ...