怎麼理解指向二維陣列的陣列指標是二級指標

2021-12-25 08:17:50 字數 3450 閱讀 6997

1樓:吳道子

一維陣列的名其實就是指標,如int a[4]=; a就相當於一個指標 int *p=a;沒錯

但是二維陣列 int aa[2][3]=; 這個時候是不能用int **pp=aa;是錯誤的。

實際上二維陣列的第一維是int (*ab)[3],是個指標陣列,不是陣列指標。這個時候int (*ab)[3]是與 int **不同的。所以接受二維陣列時要用 int (*ab)[3],不能用二級指標int**pp

陣列指標是int *ab[3]這種形式,ab先與結合,形成一個一維陣列,這個陣列的元素都是int*的指標,所以叫做陣列指標。這個時候可以用int**p=ab;是對的。因為二級指標只能指向存有int*的位置,而陣列內部都是int*的元素。

所以陣列指標就是二級指標。而二維陣列不能直接作為二級指標。它是一維指標陣列int (*ab)。

這個指標陣列解釋就是首先是一個指標(*ab),然後是一個陣列,存放int元素。可以用這個指標ab去訪問,**ab第一個元素;*(*ab)[1]第二個元素。

如果是二維陣列指標int *ab[2][3];這個時候不能類推,用**指標int***ppp=ab;是錯誤的。這個時候第一維其實是int*(*a)[3],是一個指標,然後是個陣列,存放3個int* 元素。你不能將int*(*)型別直接等價於int***,理由與二維陣列不能直接用二級指標表示一樣。

其實說這個有點多餘了。

2樓:

這個答案把指標陣列和陣列指標搞反了,重新修改下吧,我第一次看還以為你的是對的,搞了好久才分清

指向二維陣列的指標

3樓:小舅舅有點帥

int(*p)[10]定義了一個指向二維陣列的指標p,賦給它10個長度,把a陣列的值賦給(*p)[10]。

注意,這裡是a陣列是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,將a[1][0...9]放入(*p)[1]。

最後(*p)[10]中的值只有五行被初始化為a陣列的值了。

在本例中,p和p[0]是同一個意思,就是陣列a的起始地址,等價於cout

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout

0012feb8

0012feb8

#include

#include "iostream"

using std::cout;

using std::endl;

using std::hex;

void main()

int a[5][10]=;

int (*p)[10]=a;

cout<<*p

0012feb8

這是p和p[0]的區別就體現出來了。因為*p並不是取首元素的值,它這時才相當於p[0]。那如何通過p取得首元素的值呢,很顯然,應該再加一個*操作符,如下:

cout<<**p<這時輸出結果自然就會和(*p)[0]一樣是1了。

擴充套件資料

設p是指向二維陣列a[m][n]的指標變數,則有:

int* p=a[0];//此時p是指向一維陣列的指標。p++後,p指向 a[0][1]。

如果定義int (*p1)[n];p1=a;p1++後,p1指向a[1][0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下:

p+i*n+j

相應的如果用p1來表示,則為*(p1+i)+j

元素a[i][j]相應的指標表示為:

*( p+i*n+j)

相應的如果用p1來表示,則為*(*(p1+i)+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]

4樓:匿名使用者

一、你的 float score 陣列定義的是:一個3行、4列的二維浮點陣列,陣列的元素為浮點數。如果你換個格式書寫就清晰了!

float score[3][4]=,,};

在呼叫的過程中,score 就是這個陣列的首地址,指向的是浮點陣列。score + 1 指向的是陣列。

二、你的 float *p 定義的是:一個指向浮點數的指標。這個是一維的。

在呼叫的過程中,float 指向的是 xx。一個浮點數字。

兩個的定義不同,所以引數傳遞過程中會出錯。

三、你的 float (*p)[4] 定義的是:一個指向含有四個元素的浮點陣列的指標。

在呼叫的過程中,float 指向的是,由四個浮點陣列成的陣列。

這時兩個定義相同,所以引數傳遞過程中沒有錯誤。

四、有個建議,你的程式書寫格式不清晰,不利於你糾錯和修改,應該儘量的清晰、明確,不建議使用簡化方式定義引數。

作為一個軟體工作者,應該儘量使程式流暢、格式清晰、易讀,這是一個軟體工作者最基本的職業素養。

格式化後,程式如下,會清晰很多:

#include

void main()

,,};

search(score,2);

} void search(float (*p)[4],int n)/*這裡的 float *p 好像有問題*/

printf("\n");}

5樓:匿名使用者

p[0]指向陣列a的起始地址

p[9]野指標

二級指標和二維陣列行指標

6樓:好程式設計師

二維陣列即a[i][j],如a[1][1]是第一行第一列的那個數;指標只是指向了這個數所在的地址,沒有具體指出那個數.他們的區別 一個是指向具體的數,一個是執行了該數所在的地址

關於二維陣列指標的問題

其實這是c在實現多維陣列時的魔術而已,實際上a就是一個12個int的資料區。你在寫a 1 2 時編譯器實際上知道這個陣列一行是4個元素,所以計算它的地址為a 1 4 2,即a 1 2 就是 a 1 4 2 另一方面,編譯器允許使用形如a 1 這樣的表述,由於它知道a是一個定義為a 3 4 的陣列,所...

二維陣列名是不是「指標」,二維陣列名是不是一個「指標」?

理解一復 陣列名就是地址制常量,地址常量就是不能更改的地址,一旦定義了一個陣列就定了 指標是變數,這是和陣列本質的區別,他可以令他隨意等於任何一個有效的地址 理解二 個人認為陣列名不佔空間,就是個標誌,名字,和人名一樣,人名不佔空間,a 5 a作為左值,實際就是一個地址,在c語言中,廣義的說,任何名...

c語言二維陣列

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