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語言中,廣義的說,任何名... 因為你的s是一個二維陣列。如果你的s是一維陣列,像s 20 這樣,那麼在gets時不需要加 0 你定義的s是個二維陣列,並且是char型別,所以每一行存放一個字串。s n 代表第n 1行,而gets時的引數需要是一個字串指標,或者字串陣列名,所以這裡必須要寫作gets s n 其中0 n 20 我明...關於二維陣列指標的問題
二維陣列名是不是「指標」,二維陣列名是不是一個「指標」?
c語言二維陣列