首先二維數組有如下兩種定義方式:
A.
int Arr[2][3]={{1,2,3},{4,5,6}};
B.
int **Arr=new int* [2]; for(int i=0;i<2;i++) Arr[i]=new int[3]; //initialize for(int i=0;i<2;i++) for(int j=0;j<3;j++) Arr[i][j]=i*3+j+1;
但是兩種方式有一個重要的區別:方式A聲明的二維數組是按行連續存儲的,而方式B的每行之間一般並非連續存儲!
例如:雖然兩種方式都可以通過 Arr[i][j] 或 *(*(Arr+i)+j) 訪問元素,但是方式A可以通過如下的類似一維數組的訪問方式訪問元素
*(Arr[0]+i*cols+j)
而這種訪問方法對於方式B是不正確的。
利用方式A二維數組按行連續存儲這種性質,可以將二維數組轉為一維指針作為函數參數,且具有良好的擴展性:
1.如已知有一按方式A定義的二維數組Arr,具有rows行,cols列,那麼欲將其作為函數Func的參數可以如下聲明
void Func(int *A,int rows,int cols){ for(int i=0;i
也許我們還會想不用一維指針而是利用二維指針作為函數參數,如 void Func(int **A,int rows,int cols);那麼在引用時即 Func(Arr,2,3); 會報錯提示“int (*)[3] 類型的實參與 int ** 類型的形參不兼容”即參數類型不匹配。所以,用方式A定義的二維數組只能按如上方式轉為一維指針作函數參數。 而利用二維指針作函數參數這種方法適用的是方式B。
2.由於方式B定義的二維數組非按行連續存儲,所以作函數參數的只能是二維指針,即如下聲明
void Func(int **A,int rows,int cols){ for(int i=0;i綜上,想將二維數組作為函數參數,首先要明確二維數組是按那種方式定義的(A or B),然後再采用相應的函數聲明方式。兩種函數聲明方式針對不同行列數都具有良好的擴展性。以上雖然是以二維數組為基礎作討論,但是原理可相通的推廣到三維及以上的多維數組,處理方式都是一樣的。