c語言中的二維陣列a可以表述為a

2021-03-04 09:14:34 字數 6060 閱讀 5274

1樓:匿名使用者

這個表述是有問題的,*(*(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)」這個題設本身是錯誤的,不要被其誤導。

2樓:才那

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

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

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

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

3樓:藍青霄

首先糾正一個題裡的小錯誤,二維陣列應該是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]了

4樓:油菜花零

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

5樓:匿名使用者

這個是列指標吧

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

c語言中 二維陣列@a[i][j]的地址為什麼可以表示成*(a+i)+j難道*(a+i)還表示一個地址的值?求高手詳細解釋

6樓:匿名使用者

依據《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)。

7樓:問號朵朵

表達錯誤,差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)

8樓:陳宗權

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

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

9樓:涓涓細流

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

c語言中二維陣列a[i][j],為什麼a=*a?

10樓:匿名使用者

在c語言中,二者是相同的地址值。所以可以說a=*a.

二維陣列a定義為a[i][j]時,代表一組資料,有i行j列,共計i*j的元素。

這組資料在記憶體中是連續存放的。而在c語言的使用中,a是二維陣列的首地址。*a也就是a[0],是二維陣列第一行的首地址。

所以,二者是相同的地址值,即資料a[0][0]的地址值。

也就是說,從值上,a,*a, a[0],&a[0][0]都是相同的值。

當時,說a=*a也並不是完全正確的,從型別上,a等同於二維指標,而*a等同於一維指標。二者型別並不相同,只是在一定條件下可以轉換。

11樓:匿名使用者

我理解問題中的這個=樓主是指相等,而且是數值上相等。這是肯定的。*a實際是*(a+0)+0,也即是a[0]+0這個地址,和a一樣,其數值也是這個二維陣列的首地址。

但是二者含義可不同,不能直接相互賦值。a是行指標,即a是一個大小為i的陣列,其元素也是陣列,大小為j。*a由上面的解釋,其實質是個列指標,指向a的第一個元素(大小為j的陣列)的第0個元素。

12樓:匿名使用者

#include "stdio.h"

main()

} 正確的寫法應該是上面這樣的。

這裡涉及到2個問題:

1.陣列宣告的時候a[9]就是有9個元素的陣列,a[10]就是有10和元素的陣列

2.陣列賦值的時候第一個元素的下標是從0開始的,即a[0],最後一個下標是宣告時的數字-1,如:宣告時:a[9],最後一個元素是a[8]。a[9]是超範圍的。

13樓:

陣列名a表示二維陣列的首地址,*a就好比第一行的地址值a[0],a[0]表示&a[0][0]....

14樓:匿名使用者

二維陣列的指標比較特別,* 的作用是將行指標轉換成列指標,陣列名a是指向第一行的指標,*a則是指向第一行第一列的指標,根本含義上市不一樣的,但是值都是a【0】【0】的地址

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)

c語言中二維陣列a[i][j]中,a+i=*(a+i)=a[i]=&a[i]是怎麼理解的.

17樓:理科女

a+i=*(a+i)=a[i]=&a[i]&a[i] 和a+i是獲取i行陣列的首地址a[i] 和*(a+i)是訪問第i行的陣列望採納!!

18樓:暴躁內酷

樓主 這幾個不是相等的 其中a+i和&a[i]都是表示的記憶體地址 而*(a+i)和a[i]是取值。

19樓:匿名使用者

首先,a表示地址,a+i 表示相對於地址a偏移 i 個單位的地址,即,a + i 也是地址

a[i]表示第幾行的地址

&a[i]表示對第i行的地址再取地址。

20樓:匿名使用者

&a[i] 和a+i是獲取i行陣列的首地址

c語言二維陣列a[i][j],為什麼a[1]和*(a+1)等價啊?*(a+1)為什麼會是一個地址?弄糊塗了,請高手解答

21樓:

*(a+1)指標取得不就是地址嗎

22樓:匿名使用者

*(a+1)是定義的指標,

因為陣列的起始地址a[0]可以用a來代替~

所以a[1]和*(a+1)是同一個地址

23樓:

首先a代表整個陣列的首地址沒問題吧,a+1就是把地址下移,*(a+1)就是取其地址的內容。這回可以理解了吧!

c語言的二維陣列中a[i]+j這個j為什麼表示的是位元組數?

24樓:匿名使用者

指標變數的增減是按地址進行的,a[i] + j應該表示的是a[i] + j*sizeof(....)。

25樓:金色潛鳥

如果有二bai維陣列

short int a[4][5];

那麼 a[i] 就不是du下標變數,而是地址:zhi&a[i][0]

所以 a[i]+j 是 a[i] 這個dao

單元所在地專 的 下面 的 第 j 個 元素的 地址

a[i]+j 等於屬加的這項東西 就是 j乘2 個 位元組。

老譚的書很老了。現在的 int 預設 是 4 位元組。

int a[4][5]; a[i]+j 是加的這項東西 就是 j乘4 個 位元組

char a[4][5]; a[i]+j 是加的這項東西 就是 j乘1 個 位元組

double a[4][5]; a[i]+j 是加的這項東西 就是 j乘8 個 位元組

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

26樓:

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來表示。

c語言中二維陣列的定義問題C語言中二維陣列的定義問題

正確寫法如下 char fd jgf1 maxitemlen 1 說明 把null去掉 1.二維陣列的第一個維度預設是 舉個例子 int tar 2 因為大括號中有4個元素,而且第二個維度是2,所以就可以計算出來第一維度是2.所以是可以預設的。2.你的這個例子中,第一維預設的應該是 7 8 1 ma...

c語言二維陣列

因為你的s是一個二維陣列。如果你的s是一維陣列,像s 20 這樣,那麼在gets時不需要加 0 你定義的s是個二維陣列,並且是char型別,所以每一行存放一個字串。s n 代表第n 1行,而gets時的引數需要是一個字串指標,或者字串陣列名,所以這裡必須要寫作gets s n 其中0 n 20 我明...

c語言中二維陣列如何部分賦值?求解,謝謝

給二維陣列中的部分元素賦值,一般是採用單個元素逐個進行賦值。內如果是為每一行的前若干個容連續元素賦值可以在定義陣列變數的時候一起初始化。這時候,初始化必須要為整個陣列全部元素賦值或者為陣列中,前若干行的前若干個元素賦值,這時其餘未賦值的元素自動被賦值為初始值0。include include int...