二維陣列
學習交流,請少俠駐足:C/C++學習交流 8群 491994603
要對二維陣列做一些詳細的理解,那麼我們先要複習下一維陣列的幾點知識:
更多問題解答,學習交流,請少俠駐足:C/C++學習交流 8群 491994603
對於一維陣列,大家肯定知道,一維陣列的陣列名稱可以當成一維指標使用,也就是說,可以用一個一維指標,把陣列首位址賦值給這個指標,然後把這個指標當成陣列名稱用.
int arr[5]={1,2,3,4,5};//一維陣列
int *p=arr;
然後可以用指標p來處理這個陣列裡面的元素,比如說p[0]就是arr[0],p[1]就是arr[1],和陣列名稱的使用都完全一樣.
對於一維陣列,*(arr+i)等價於arr[i],可以推出一個特例,*arr等價arr[0];
以上的結論在二維陣列中同樣適用,,但是要做一些小小的變形,首先我們定義一個足夠大的二維陣列,避免下面的討論中出現越界問題,就像這樣:
int array[M][N];//定義一個M*N的二維陣列 M和N都是一個很大的整數
二維陣列中,我們一般用行和列來區分,M*N就是一個M行N列的陣列.
對於二維陣列而言,裡面的元素可以用下標來表示,比如說array[i][j]
二維陣列的下標也是從0開始,array[0][0]就是陣列的第一個元素
二維陣列比一維陣列而言更加的複雜,上面說過, 對於一維陣列,*(arr+i)等價於arr[i],那麼對於二維陣列來說,array[i][j]可以有如下表示方法:
學習交流,請少俠駐足:C/C++學習交流 8群 491994603
array[i][j] (*(array+i))[j] *(array[i]+j) *(*(array+i)+j)
其中i和j都是可以取0的,也就是說如果i或j等於0,會有如下幾種方式
i等於0的情況(寫法1)
array[0][j] (*array)[j] *(array[0]+j) *(*array+j)
j等於0的情況(寫法2)
array[i][0] (*(array+i))[0] *array[i] **(array+i)
上面的括弧都是因為優先順序的原因,去掉的話結果就不一樣了,其中優先順序有
小括弧()>中括弧[]>取值符號*>加號+
對於一個二維陣列,我們可以從幾個不同的方向來分析
方向一:陣列
陣列都是存放在一塊連續的記憶體中的,也就是說可以用一個一維指標指向其中一個元素
比如說int *p1=&array[0][0];//這裡等價int *p1=arr[0];
然後想要訪問array[i][j],就是*(p1+i*N+j)或者*(p1+j*M+i),這個可以應用到各種地方,比如說想要用一維陣列來代替二維陣列使用,就可以用上面這種方式;
通過上面的賦值之後p1其實就可以當做array[0]使用,也就是說*(p1+i*N+j)等價*(array[0]+i*N+j),由上面寫法1得到另外一個等價的形式array[0][i*N+j]
假設有m和n和元素array[m][n],m和n可以為正數或負數,m可以大於M,n也可以大於N,它等價array[0][m*N+n],也就是說如果滿足0<=m*N+n<=M*N-1,那麼這個元素就存在於這個陣列當中.轉換為標準的下標就是i=(m*N+n)/N,j=(m*N+n)%N
二維陣列無論是傳參數還是申請記憶體都要事先指定陣列的列的大小,一維陣列則不需要,也就是說如果你想要一個x*y大小的二維陣列,但是xy的值不是常量的話,可以用申請一維陣列,然後用上面的方式當二維陣列使用.
方向二:陣列的陣列
二維陣列可以看成陣列的陣列,因為array[0]可以視為一個一維陣列的陣列名稱,array[0][0]是array[0]中的第一個元素,array可以看成一個陣列的陣列名稱,也就是看成一個常屬性的陣列指標.
int (*q)[N];//定義一個陣列指標,要指明陣列的列
q=array;//這樣的話就可以用q來代替array,用法是一樣的
如果是申請一個陣列指標,那麼除了q=array之外,還可以有q=&array[0]這樣,他們的效果是一樣的.區別於array,q是一個指標,所以q可以進行q++這樣的操作,但是需要注意的是,q++之後,q不再指向首位址,雖然可以q[i][j]但是和array[i][j]已經不是同一個元素了
#include
int main()
{
int array[3][4]={0};
int (*q)[4]=array;
q++;
q[1][2]=4;
printf(“array[1][2]=%d array[2][2]=%d ”,array[1][2],array[2][2]);
getchar();
return 0;}
對於陣列指標,q++等於移動了一個陣列長度的位址,上面的代碼可以說明,你也可以試著把所有內容全部列印出來.
最後補充下關於二維陣列元素位址的問題,用scanf的話需要取位址,我們首先看下關於二維陣列的元素
array[i][j] (*(array+i))[j] *(array[i]+j) *(*(array+i)+j)
取位址加一個取位址符&就可以,取值符號和取位址符號相當於逆運算,也就是說可以寫成下面四種方式代表array[i][j]的位址:
&arr[i][j] &(*(array+i))[j] array[i]+j *(array+i)+j
scanf(“%d”,array[i]+j);//四種方式都可以使用
附錄1.字串陣列和字元指標陣列
字串陣列也就是char類型的二維陣列,使用方式和上面的類似,只是需要注意下字串後面的’
附錄1.字串陣列和字元指標陣列
字串陣列也就是char類型的二維陣列,使用方式和上面的類似,只是需要注意下字串後面的’