二維陣列傳參要點

一月一星辰發表於2024-08-28

最近在寫程式碼的時候又一次遇到了需要二維陣列傳參的操作,搗鼓了半天,總是會指標有問題,上網上查閱了相關資料後,雖然弄懂了,但是後面還是把二維改成一維了。但是呢?還是把相關的學習記錄整理下來,以防後續還是需要用上。 這裡主要以如何宣告函式,如何呼叫函式,在函式中如何使用來講解。

形參為二維陣列

函式宣告

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部落格

相關文章