最近在寫程式碼的時候又一次遇到了需要二維陣列傳參的操作,搗鼓了半天,總是會指標有問題,上網上查閱了相關資料後,雖然弄懂了,但是後面還是把二維改成一維了。但是呢?還是把相關的學習記錄整理下來,以防後續還是需要用上。 這裡主要以如何宣告函式,如何呼叫函式,在函式中如何使用來講解。
形參為二維陣列
函式宣告
void function(int a[m][n]);//函式宣告
void function(int a[][n]);//不論多少維陣列,第一維都可省略。
//憑什麼,第二維就不可省略呢?由編譯器的定址方式決定。
函式呼叫
function(a);//函式呼叫 實參直接寫陣列名!陣列名!(重點)。
//(注意)function(a[m][n])或function(a[][n])都不可以!
//話說,寫陣列名多好,簡單輕鬆。
函式中使用
*(a[i] + j) //代表第 i 行 第 j 列 *(*(a+i) + j)
//同上 *((int *)a +i*n +j )
//同上,n表示第二維陣列長度,即列寬
//不管怎麼樣,a[i][j]不被允許。也是由編譯器的定址方式決定。
形參為陣列指標
函式宣告
void function(int (*a)[n]);
//不是(int *a[n])(指標陣列) ,而是(int (*a)[n])(陣列指標);
// 緣由是 [] 的 優先順序比 *的大
函式呼叫
function(a);//函式呼叫 實參同樣直接寫陣列名!
//(注意)function(a[m][n])或function(a[][n])同樣都不可以!
函式中使用
*(a[i] + j) //代表第 i 行 第 j 列 *(*(a+i) + j)
//同上 *((int *)a +i*n +j )
//同上,n表示第二維陣列長度,即列寬
//a[i][j]不被允許。由編譯器的定址方式決定。
形參為二級指標
函式宣告
void function(int **a,int n);
// n表示第二維陣列長度,即列寬
函式呼叫
function( (int **)a,int n);
//實參不能為陣列名!*與上面相反*!有兩個 * !
//(注意)function(a)或function((int *)a)不可以!
函式中使用
*((int *)a +i*n +j )
//只有一種!n表示第二維陣列長度,即列寬
//其他不被允許。由編譯器的定址方式決定。
參考連結:[C語言]二維陣列傳參的格式(詳細+總結)_c語言傳入二維陣列-CSDN部落格