c語言中二維陣列a的地址為什麼可以表示成

2021-05-13 02:22:06 字數 5700 閱讀 2206

1樓:匿名使用者

依據《c語言深度剖析》「多維陣列與多級指標」章節 原文如下:

以陣列下標的方式來訪問其中的某個元素:a[i][j]。編譯器總是將二維陣列看成是一個

一維陣列,而一維陣列的每一個元素又都是一個陣列。a[3]這個一維陣列的三個元素分別為:

a[0],a[1],a[2]。每個元素的大小為 sizeof(a[0]),即 sizof(char)*4。

由此可以計算出 a[0],a[1],a[2]

三個元素的首地址分別為& a[0],& a[0]+ 1*sizof(char)*4,& a[0]+ 2*sizof(char)*4。亦即 a[i]

的首地址為& a[0]+ i*sizof(char)*4。這時候再考慮 a[i]裡面的內容。就本例而言,a[i]內有 4

個 char 型別的元素,其每個元素的首地址分別為&a[i],&a[i]+1*sizof(char),

即 a[i][j]的首地址為&a[i]+j*sizof(char)。再把&a[i]

的值用 a 表示,得到 a[i][j]元素的首地址為:a+ i*sizof(char)*4+ j*sizof(char)。同樣,可以換

算成以指標的形式表示:*(*(a+i)+j)。

2樓:問號朵朵

表達錯誤,差1錯誤:

a[i][j]的地址應該表示為:*(a+i-1)+j-1

例:int a[3][4]; 則:

*(a):表示第一行的首地址,即:(*(a))[0],表示第一行第一個元素地址,值為:*((*(a))[0])。

*(a+1):表示第二行的首地址,即:(*(a+1))[0],表示第二行第一個元素地址,值為:*((*(a+1))[0])。

*(a+2):表示第三行的首地址,即:(*(a+2))[0],表示第三行第一個元素地址,值為:*((*(a+2))[0])。

*(a+3-1)+4-1:表示最後一個元素的地址。它的值是:*(*(a+3-1)+4-1)

3樓:陳宗權

a是一個二維陣列,a[i]表示其中的一行,是個一維陣列,a[i][j]表示一行裡面的一個元素。

*(a+i)就是a[i],是一個一維陣列,當然表示一個地址,表示這個一維陣列裡面的第一個元素a[i][0]的地址。

4樓:涓涓細流

在這裡,*a[i]是一個指標變數,它指向含j個元素的一維陣列。

為什麼c語言中*(a+i)+j能表示a[i][j]的地址

5樓:

int a[3][4]; //假設定義一個3行4列的二維陣列,所謂二維陣列就是陣列的陣列

a[0]、a[1]、a[2]是陣列a的元素,而這個元素是陣列,而不是我們通常認為的基本資料型別的資料

所以*(a+i)就是獲取陣列a中第i個元素,等價於a[i],而a[i]本身又是一個包含有4個int型數值的陣列,a[i]是這個一維陣列的陣列名,我們知道陣列名的本質是一個地址,是陣列首元素地址,所以

*(a+i)+j就是表示下表第i行的第j個元素的地址了。所以,

*(a+i)+j表示的含義是元素a[i][j]的地址,也可以用a[i]+j來表示。

6樓:聽不清啊

int a[2][3]=;

printf("%d ",*(*(a+1)+2));

以上的引用能夠輸出60

因為a是二維陣列名,所以它是指向指標的指標(二級指標)。

*(a+1)就是a[1],它是一個一維陣列,也是一維陣列的首地址(指向一維陣列首元素的指標)。*(a+1)+2就是a[1][2]的地址,*(*(a+1)+2)就是a[1][2]。

7樓:匿名使用者

*(a+0)取出a[0]的值

a[0]的元素又是一個一維陣列

因此*(a+0)取出的就是這個一維元素的首地址那麼*(a+0)+0表示: 一維陣列a[n]中, a+0陣列元素a[0]的地址

*(a+0)+1表示一維陣列的1號陣列元素的地址

c語言中的二維陣列a[a][j]可以表述為*(*(a+1)+j),但是我看不懂這個東西啊 求解釋啊

8樓:匿名使用者

這個表述是有問題的,*(*(a+1)+j)沒有規定首地址,*(a+1)已經表示a+1地址中的資料了,明顯與陣列概念不合。

a[a][j]裡面陣列名稱和一個維度的陣列的個數表示重疊了,所以我換一種方式來表示:a[y][x]。為了便於理解,假定y=3,x=2。

在陣列中的資料有y行,x列;也就是3行,2列。假定第一行資料為;第二行資料為;第三行的資料為,那麼陣列a在記憶體中的資料為從首地址開始的連續6個資料,。假定首地址為0x01,那麼a[0][0]的地址為0x01,對應資料「1」,該可以表示為((行數 + 0x01)+ 列數),該地址的資料可以表示為*((行數 + 0x01)+ 列數),這個表示形式,和題目中的比較接近。

以此類推,a[0][1]的地址為0x02,對應資料「2」;a[1][1]為第2行第2列,地址為0x04,對應資料0x04。

由此可以看出a[y][x]可以表示為*((x + &a) + y);&a為陣列a的首地址。

不知道這樣講您是否能夠理解。同時「c語言中的二維陣列a[a][j]可以表述為*(*(a+1)+j)」這個題設本身是錯誤的,不要被其誤導。

9樓:才那

不可以寫成a[a][j]

a+i是一個陣列元素的地址,而*(a+i)是取該地址裡的資料,如果*(a+i)中儲存另一個陣列的首地址的話,**(a+i)就能取到另一個陣列裡的第一個資料.

依次類推,取該陣列其他資料*(*(a+i)+j)就能取到第a[i][j]了

最簡單直觀理解為一個陣列中的每個元素又儲存了其他陣列。

10樓:藍青霄

首先糾正一個題裡的小錯誤,二維陣列應該是a[1][j];陣列元素的表示方法(以一維為例)a[i]等價於*(a+i),因為陣列名即為陣列的首地址,(a+i)即為陣列a的第i個元素的地址,*(a+i)就理所當然是a[i]了。再說二維陣列,二維陣列的陣列名可看為一個指標的指標,*(a+1)就表示二維陣列的第二排陣列首地址a[1],然後這個地址加j即為a[1][j]的地址,*(*(a+1)+j)就是二維陣列a[1][j]了

11樓:油菜花零

*(a+1)表示a向下一行的地址,*(a+1)+j表示向下一行後再向右j列,*(*(a+1)+j)表示地址a向下一行後向右j列的記憶體地址的值。相當於a[1][j],不知道你說的a[a][j]是什麼

12樓:匿名使用者

這個是列指標吧

嗯。你就把二維陣列當做指標的指標這樣的話感覺起來就輕鬆多了

c語言中二維陣列的引用和地址有什麼區別嗎?比如a[i]地址&a[i],a+i,p+i,引用a[i],*(a+i)(這不應該是地址

13樓:處男者

你這種情況比較複雜!一個陣列名本身是一個常量地址,比如陣列a[10],a就是該陣列在記憶體分配空間的起始地址。要引用陣列中各個元素。

a[i]是陣列專用的方法,它本身就是指a往後偏移i個長度記憶體空間裡存放的內容,因此用&取地址就變成了該內容對應的地址;也可以用*(a+i),a+i指從地址a偏移i個長度(此長度不是位元組,取決於陣列儲存的元素型別)的地址(注意此時它不是指裡面的內容),因此加上*以取到裡面的內容。

也就是說a[i]指內容,因此可以用&取其地址;而a+i指地址,因此可以用*取其內容,二者形式不同,都可以一樣用。

我是這樣理解的,僅供參考。

c語言中二維陣列的引用和地址有什麼區別嗎?比如a[i]地址&a[i],a+i,p+i,引用a[i],*(a+i)(這不應該是地址嗎

14樓:焚書煮麵帥

你這種情況比較複雜!一個陣列

名本身是一個常量地址,比如陣列a[10],a就是該陣列在記憶體分配空間的起始地址。要引用陣列中各個元素。a[i]是陣列專用的方法,它本身就是指a往後偏移i個長度記憶體空間裡存放的內容,因此用&取地址就變成了該內容對應的地址;也可以用*(a+i),a+i指從地址a偏移i個長度(此長度不是位元組,取決於陣列儲存的元素型別)的地址(注意此時它不是指裡面的內容),因此加上*以取到裡面的內容。

也就是說a[i]指內容,因此可以用&取其地址;而a+i指地址,因此可以用*取其內容,二者形式不同,都可以一樣用。

我是這樣理解的,僅供參考。

c語言問題 二維陣列a[10][10]的第i行第i列的值可以表示為*(*a+i*10+j) 這句話 怎麼理解

15樓:匿名使用者

*a是指向a[0][0]所在地址的指標

由於陣列中的資料是順序儲存的,所以第i行第j列的資料的地址就是*a+i*10+j(可以參考矩陣的資料位進行理解)

最後一點就是指向指標的指標實際上就是資料,是第一個指標所指向的地址內的資料

這是指標這一塊兒的難點

直接說,*a+i*10+j是指向所取資料地址的指標,外面再加一個*就是變成了指標的指標,是所指地址內的資料值

ps:在這裡是不需要考慮資料型別的,因為在陣列資料的呼叫過程中系統會自動把資料型別長度乘上(i*10+j)

16樓:匿名使用者

*a是指向a[0][0]的指標,因為在記憶體中a是按照a[0][0],a[0][1],...,a[0][9],a[1][0],a[1][1],...的順序存放的,所以*a+i*10+j就是指向a[i][j]的指標

所以a[i][j]=*(*a+i*10+j)

在二維陣列中為什麼 *(a+i)+j 代表的是地址而不是值元素?

17樓:廨嶔昚

可以這麼說吧, 在二維陣列中,陣列名a指向二維陣列的第一行,就是&a[0]. a+i就是代表第i行地址,即&a[i]. 而*(a + i)是求第i行首元素的值,就是a[i].

這時指標從指向行元素轉為指向列元素.*(a + i)+j就是a[i]+j,是a[i][j]的地址. *(*(a + i)+j)是a[i][j]的值.

c語言中a+i是地址嗎,書上說a+i是a[i]的指標,既然這樣,那麼*(a+i)為什麼還是

18樓:

a+i其實就是&a[i],肯定是地址

*(a+i)其實就是a[i],如果a是二給陣列的陣列名,a[i]就肯定是地址(等同於&a[i][0]),如果a只是一維陣列(指標陣列除外)的陣列名,a[i]就不是地址(原因是:二維陣列可以看作是多個一維陣列組成,即陣列的陣列)

*(a+i)+j就是&a[i][j],如果陣列a是二維陣列那就肯定也是地址啦

a[i][j]則是表示為*(*(a+i)+j)

19樓:匿名使用者

a應該是指的陣列名字吧

你首先應該知道陣列名字本身就是地址了

a+i是說a的地址向後在移動i個位置

也就是a[i]

a是指的陣列的首地址,開頭的位置

*(a+i) 也就是*a[i] 也就是a[i]的地址,只是這個地址離首地址偏移了i位置

再加上j 就是 a[i][j]地址

*(a+i)+j是針對二維陣列來說的,也可以說是特殊的一維陣列。

20樓:賽罡諫陽澤

是地址,你要取值是要*(

*(a+i)+j)的

*(a+i)其實就是a[i][0]的地址

為什麼在c語言中二維陣列第二維下標可以越界

因為陣列是連續儲存的,所以a 0 3 就是第四個儲存的資料,你可以試試a 0 4 越界復是肯定的,但是越界不代表程 制序會出 bai錯,你這個地方越界du後訪問的正好是下一個元素4,是zhi一個dao有效值,所以不會出錯。可以試試訪問a 3 3 這個時候不一定會訪問到什麼東西,這時就很容易出現記憶體...

c語言中如何定義二維陣列,C語言中如何定義一個二維陣列

int a 2 3 a 0 0 a 0 1 a 0 2 a 1 0 a 1 1 a 1 2 表示兩行三列 include main int i,j,total 0 for i 0 i 3 i printf n printf total d n total 用指標new出來 二維陣列定義必須規定列 i...

c語言二維陣列迴圈賦值,C語言二維陣列迴圈賦值

這個只是陣列值的大小和行列的關係而已 就代表改數的值等於所在行數的4倍加所在列數加1 c語言中怎樣實現對二維陣列元素進行賦值並輸出。可以按照下面步驟進行定義二維陣列並輸出 1 定義二維指標。2 確定內陣列維數,即行數容和列數。3 申請行數個一維指標大小空間,並賦值給二維指標。4 對於每個一維指,申請...