c語言中二維陣列名是不是可以看作指標陣列名

2021-12-27 18:23:05 字數 6984 閱讀 9069

1樓:安心播音

不可以,二維陣列要看做「陣列的陣列」。

(以如下定義為例:int a[4]; int * p;)給你個對於指標和陣列的正確理解吧:

定義的不同:c 裡,指標和陣列是不同的型別,不要把陣列名看做「常指標」。所以 sizeof(a) 和 sizeof(p) 值是不同的。

操作:除宣告外,中括號操作符僅用於指標,如 p[0],p[5] 等。當使用 a 時,要看做 (int*)a 。

比如 a[0] 要看做 ((int*)a)[0] , *a 要看成 *(int*)a 。(除 sizeof 以及類似操作以外)

所謂的「二維陣列」,「二級指標」,「指標陣列」,以及「陣列指標」的理解應該為:

基礎型別為陣列的陣列,

基礎型別為指標的指標,

基礎型別為指標的陣列,

基礎型別為陣列的指標。

比如二維陣列定義為 int b[3][4]; ,可以看做:

typedef int a[4];

a b[3];

其它類推。

2樓:

二維陣列的名稱就是指標的指標, 對於一維陣列,它的陣列名,就是它存放記憶體的首位址

3樓:匿名使用者

例如:二維陣列名是乙個指標,但是說它是常量的意思是它本身不可更改:如你定義int a[34][3],a確實是個指標,*a指向陣列中第乙個整數;但是你不能通過a++操作使在此操作後a指向陣列中第二個整數,而普通指標(int a[12];int *b=a;b 就是普通指標)可以這麼操作的,所以說它是「指標常量」;

c語言中二維陣列名能否直接賦給指標變數

4樓:匿名使用者

二維陣列的指標與指標的指標是不一樣的。

所以int **ppr;

int fool[2][3];

ppr = fool;

這樣是不行的。

二維數回組的指標必須

答限定第一維的大小。

所以:int (*ppr)[3];

ppr = fool;

這樣才可以。

5樓:匿名使用者

可以,但所宣告的指標型別是指向指標的指標如:

int a[3][3];

int** array_ptr=a;

6樓:匿名使用者

可以,二維陣列名本身就是表示乙個陣列的首位址。

7樓:手機使用者

可以,陣列名是陣列首元素的位址

8樓:孓圊

可以,例如a,*p=a

c語言中的二維陣列名是乙個二重指標嗎?

9樓:

應該不是的,簡單來說,陣列名,不管是多少維度的都是採用名稱**表相應的存放位址。雖然二重指標也是存放資料的位址但是其是間接的存放。就打個比方,二重指標就如乙個廠家有好多貨要賣出去。

而自己又沒有銷售渠道,只好通過**商來提貨,通過分銷商來賣給消費者;二維陣列就如廠家有貨而且自己有渠道直接銷往消費者。 不知這樣說是否容易理解。

10樓:瀚漠

不是二級指標p也可以解釋為指標的指標,即p內儲存的值實際上還是乙個指標,計算:

*p的值實際上是乙個指標值,那麼 *(*p)即二級指標指向的最終值

對於二維陣列a[2][2],a也是乙個位址,並且這個值也等於a[0],也等於a[0[0]的位址,即&a[0][0],由此看來對a取位址的值是乙個變數值(不是指標),所以a並不是乙個二級指標,最多算乙個一級指標。

11樓:匿名使用者

1、二維陣列名不是二級指標,它只是乙個比較特殊的常量指標。包括三維,四維,乃至n維陣列也是如此。只要是陣列,那麼它就是乙個普通的常量指標。

2、二級指標p也可以解釋為指標的指標,即p內儲存的值實際上還是乙個指標,計算:

*p的值實際上是乙個指標值,那麼 *(*p)即二級指標指向的最終值。

對於二維陣列a[2][2],a也是乙個位址,並且這個值也等於a[0],也等於a[0[0]的位址,即&a[0][0],由此看來對a取位址的值是乙個變數值(不是指標),所以a並不是乙個二級指標,最多算乙個一級指標。

c語言中二維陣列行指標是什麼

12樓:

就是指向每一行的指標,比如說二維陣列a[2][3];

a[0]代表的是二維陣列第零行的首位址相當於&a[0][0];

a[1]代表的是二維陣列第一行的首位址相當於&a[1][0];

a[0]+1代表的是二維陣列第零行,第一列的位址相當於&a[0][1]

13樓:匿名使用者

行指標其實就是二級指標,也就是說它指向乙個一維陣列,int a[2][3];

a[0] a[1] 就是行指標

這麼看就明白了

int a[3]=

而a[0] a[1]本身又是乙個陣列

14樓:天才繡

就是指行的指標,比如指標一開始指第一行,加一就指第二行

關於c語言二維陣列陣列名與指標的問題

15樓:匿名使用者

先說些這個2維陣列:int arr[3][4]

可以理解為乙個3行四列的矩陣,那麼第一維arr[0],arr[1],arr[2]中存的分別是對應行的位址,也就是說arr[0]存的是乙個「大小為4的整形陣列位址」

這樣的話就好理解了,arr存的位址值其實與arr[0]本質上是相同的。都是這個連續空間的開始位址。

第乙個問題,arr是個位址變數,因此它本身是個位址,而它存的其實也是個位址。

第二個問題,&arr也是首位址,不過叫「2維陣列的首位址」,卻別的話就是它有個寬度,舉個例子:「&arr+1」其實相當於「&arr[sizeof(a)+1]」這裡arr大小為7,那麼&arr+1就是從二維陣列首位址開始後的第8個整形變數空間的位址。當然從位址值的角度看它們是沒有什麼卻別的,區別在於「指標寬度」

不知道你明白沒?

16樓:匿名使用者

int (*p)[6] = arr;//定義乙個陣列指標指向二維陣列的首位址arr

這行奇葩的**就不做點評了,在如果在c++的編譯器裡編譯器絕對打臉。

陣列名代表的指標其實是降了一級的指標,比如你寫int p[10],陣列名p並不是指向十個int元素,而是指向第乙個int元素,如果希望得到int [10]的指標應該使用&p;int arr[3][4]也是如此,arr並不是指向arr[3][4],而是指向第乙個int [4]陣列,要指向整個int [3][4]使用&arr。

他們的位址都是一樣的,都是指向第乙個元素的位址,但是他們的指標指向的物件長度是不一樣的。

c語言中二維陣列的指標如何表示

17樓:夜禮服假面

二維陣列和指標

⑴ 用指標表示二維陣列元素。

要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。

乙個二維陣列在計算機中儲存時,是按行儲存的,即先儲存第一行的元素,再儲存第二行的元素。

當把每一行看作乙個整體,即作為乙個大的陣列元素時,原來的二維陣列也就變成乙個一維陣列了。而每個大陣列元素對應原來二維陣列中的一行,稱為行陣列元素,顯然每個行陣列元素都是乙個一維陣列。

下面討論二維陣列元素和指標之間的對應關係,清楚了二者之間的關係,就能用指標處理二維陣列了。

設p是指向二維陣列a[m][n]的指標變數,若有:p=a[0]; 則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:p+i*n+j用"*"運算子表示為:*( p+i*n+j)同樣,a[i][j]也可使用指標下標法表示,如下:

p[i*n+j]

例如,有如下定義:

int a[3][4]=,,};

則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是乙個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

特別說明:

對上述二維陣列a,雖然a[0]、a都是陣列首位址,但二者指向的物件不同。

a[0]是一維陣列的名字,它指向的是一維陣列a[0]的首元素a[0][0],對其進行「*」運算,得到的是一維陣列元素a[0][0]的值,即*a[0]與a[0][0]是同乙個值。

而a是乙個二維陣列的名字,它指向的是二維陣列a的首元素a[0],對a進行「*」運算,得到的是一維陣列a[0]的首位址,即*a與a[0]是同乙個值。它的指標移動單位是「行」,所以a+i指向的是第i個行陣列,即指向a[i]。

當用int *p;定義指標p時,p的指向是乙個int型資料,而不是乙個位址,因此,用a[0]對p賦值是正確的,而用a對p賦值是錯誤的。這一點請務必注意。

示例:#include

int main()

,,};

int *p=a[0],max,i,j,row,col;

max=a[0][0];

row=col=0;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

if(*(p+i*4+j)>max)

printf("address of a is:%x\n", (unsigned int)a);

printf("address of a[0] is:%x\n", (unsigned int)a[0]);

printf("address of (a+1) is:%x\n", (unsigned int)(a+1));

printf("address of (a[0]+1) is:%x\n", (unsigned int)(a[0]+1));

return 0;

}執行結果:

a[2][1]=88

address of a is:bfdc0368

address of a[0] is:bfdc0368

address of a[0][0] is:bfdc0368

address of (a+1) is:bfdc0378

address of (a[0]+1) is:bfdc036c

address of (a[0][0]+1) is:bfdc036c

從結果看出,a,a[0],a[0][0]是同乙個位址,

⑵ 用二維陣列名作位址表示陣列元素。

另外,由上述說明,還可以得到二維陣列元素的一種表示方法:

對於二維陣列a,其a[0]陣列由a指向,a[1]陣列則由a+1指向,a[2]陣列由a+2指向,以此類推。因此,*a與a[0]等價、*(a+1)與a[1]等價、*(a+2)與a[2]等價,┅,即對於a[i]陣列,由*(a+i)指向。由此,對於陣列元素a[i][j],用陣列名a的表示形式為:

*(*(a+i)+j)指向該元素的指標為:*(a+i)+j陣列名雖然是陣列的位址,但它和指向陣列的指標變數不完全相同。指標變數的值可以改變,即它可以隨時指向不同的陣列或同型別變數,而陣列名自它定義時起就確定下來,不能通過賦值的方式使該陣列名指向另外乙個陣列。

示例:求二維陣列元素的最大值。

該問題只需對陣列元素遍歷,即可求解。因此,可以通過順序移動陣列指標的方法實現。

main()

,,};

int *p,max;

for(p=a[0],max=*p;pmax)

max=*p;

printf("max=%d/n",max);

}執行結果:

max=88

這個程式的主要演算法都是在for語句中實現的:p是乙個int型指標變數;p=a[0]是置陣列的首元素位址為指標初值;max=*p將陣列的首元素值a[0][0]作為最大值初值;pmax)

}程式執行結果:

a[2][1]=88

⑶ 行陣列指標

對於指標,不管有多複雜,按照以下原則進行分析:

從變數名處起,根據運算子優先順序結合,一步一步分析。

在上面的說明中已經知道,二維陣列名是指向行的,它不能對如下說明的指標變數p直接賦值:

int a[3][4]=,,},*p;其原因就是p與a的物件性質不同,或者說二者不是同一級指標。c語言可以通過定義行陣列指標的方法,使得乙個指標變數與二維陣列名具有相同的性質。

行陣列指標的定義方法如下:

資料型別 (*指標變數名)[二維陣列列數];

例如,對上述a陣列,行陣列指標定義如下:

int (*p)[4];它表示,陣列*p有4個int型元素,分別為(*p)[0]、(*p)[1]、(*p)[2]、(*p)[3] ,亦即p指向的是有4個int型元素的一維陣列,即p為行指標。

(按照指標的分析原則進行分析:p先與*結合,說明p是乙個指標,然後與結合,說明指標指向的內容是含4個元素的陣列,然後與int結合,說明陣列中的元素為int型別。所以p是乙個指向含4個int型別元素的陣列的指標。

)此時,可用如下方式對指標p賦值:p=a;為做對比,比較一下如下指標:int *p[4];

(按照指標的分析原則進行分析:p先與結合,說明p是乙個陣列,然後與*結合,說明陣列的元素為指標,然後與int結合,說明指標指向的是int型別的變數。所以p是乙個含4個元素的指向int型別變數的指標組成的陣列。

)此外二維陣列不可以用int**型別直接賦值訪問

為什麼C語言中二維陣列的陣列名a和a表示的是同值

當定義二維陣列a m n 時,陣列名可以認為是二維指標,其指向二維陣列的首位址。於是a的值就是首位址的值。而 a,就是a 0 a 0 是第一行的標記,代表第一行的首位址。在二維陣列中,所有元素都是緊密排列的,這樣整個陣列的首位址,第一行的首位址,和第乙個元素的首位址,即a,a 0 a 0 0 都是相...

C語言指標與二維陣列求解,c語言中二維陣列的指標如何表示

假設a是乙個二維陣列,則一 a是第乙個一維陣列名,陣列名 就是該陣列的 首位址!二 a 0 和 a都表示這個一維陣列第乙個元素的內容 這句話有問題,應該是 都表示這個 二維陣列 第乙個元素的內容!三 a和a好像不等價啊?關於陣列名和 陣列名書上有明確的介紹與說明 a a a 0 a 0 這是規定!細...

二維陣列名和指標的關係,C語言中陣列名和指標的區別

二維陣列名即陣列地址,指向首行地址,表面上看,行地址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。如果a 10 10 假設int p a 那麼要對行遞增執行p 時,編譯器如何知道列寬?因為int 是指指向一個 int 型別的指標,32位系統中...