1. 程式人生 > >[C語言]二維陣列傳參的格式(詳細+總結)

[C語言]二維陣列傳參的格式(詳細+總結)

喜歡就為我點贊,評論加收藏。
轉載請標明出處[link]https://blog.csdn.net/qq_43868654/article/details/84641383

初遇二維陣列作函式引數,宛如自己化身為了大頭兒子。很頭大。

不禁大聲吶喊:該怎麼宣告定義,該怎麼呼叫,又該怎麼函式中操作元素和地址

在此,我要撥開這些問題的一些迷霧。
我相信,有心人看完後,再遇就不會怕了。

其實宣告,定義是一樣的。因此,只寫宣告
同時,把元素外層*()剝去就代表地址。因此只寫元素
最後有總結

二維陣列作函式引數,依我看來,至少可以分成三種

事先,在main函式中 int a[m][n];
好了,進入主題。

第一種形參為二維陣列

宣告

void function(int a[m][n]);//函式宣告
void function(int a[][n]);//不論多少維陣列,第一維都可省略。

//憑什麼,第二維就不可省略呢?由編譯器的定址方式決定。

呼叫

function(a);//函式呼叫  實參直接寫陣列名!陣列名!(重點)。

//(注意)function(a[m][n])或function(a[][n])都不可以!

//話說,寫陣列名多好,簡單輕鬆。

在函式操控元素

1.   *(a[i] + j)  //代表第 i 行 第 j 列
2.  *(*(a+i) + j) //同上
3. *((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])同樣都不可以!

在函式操控元素

1.   *(a[i] + j)  //代表第 i 行 第 j 列
2.  *(*(a+i) + j) //同上
3. *((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表示第二維陣列長度,即列寬

//其他不被允許。由編譯器的定址方式決定。

總結
宣告定義(分三種)。
二維陣列,陣列指標,二級指標。(都是指標)
呼叫(一對一,二對二)
陣列指標,二維陣列就寫一級指標即 陣列名.
二級指標就寫二級指標即 (int**)陣列名
在函式中操作元素(注意二級指標,只能用最後的方法)

  1. *(a[i] + j) //代表第 i 行 第 j 列
  2. ((a+i) + j) //同上
  3. *( (int * )a +i * n +j )//n表示第二維陣列長度(列寬)
    也就是說 3. 是萬能的。

宣告,定義是一樣的。
同時,把元素外層
()剝去就代表地址。

喜歡就為我點贊,評論加收藏。
轉載請標明出處[link]https://blog.csdn.net/qq_43868654/article/details/84641383