二維陣列指標傳參

2021-10-22 14:39:24 字數 1794 閱讀 3410

希望能幫助到你,我將無比快樂。

你的點讚✌️,是我前進的動力。

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

在此,我要撥開這些問題的一些迷霧。

我相信,有心人看完後,再遇就不會怕了。

其實宣告,定義是一樣的。因此,只寫宣告。

同時,把元素外層*()剝去就代表位址。因此只寫元素。

最後有總結。

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

事先,在main函式中 int a[m][n];

好了,進入主題。

第一種形參為二維陣列

宣告void function(int a[m][n]);//函式宣告

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

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

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

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

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

345在函式操控元素

*(a[i] + j) //代表第 i 行 第 j 列

((a+i) + j) //同上

*((int )a +in +j )//同上,n表示第二維陣列長度,即列寬

//不管怎麼樣,a[i][j]不被允許。也是由編譯器的定址方式決定。12

345第二種形參為陣列指標

(其實只是 宣告定義 與第一種不同,其他一樣)

宣告void function(int (*a)[n]);

//不是(int *a[n])(指標陣列) ,而是(int (*a)[n])(陣列指標);

// 緣由是 的 優先順序比 *的大12

3呼叫function(a);//函式呼叫 實參同樣直接寫陣列名!

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

3在函式操控元素

*(a[i] + j) //代表第 i 行 第 j 列

((a+i) + j) //同上

*((int )a +in +j )//同上,n表示第二維陣列長度,即列寬

//a[i][j]不被允許。由編譯器的定址方式決定。12

345第三種形參為二級指標

宣告void function(int **a,int n);n表示第二維陣列長度,即列寬1呼叫

function( (int **)a,int n);//實參不能為陣列名!與上面相反!有兩個 * !

//(注意)function(a)或function((int *)a)不可以!12

3在函式操控元素

*((int )a +in +j )//只有一種!n表示第二維陣列長度,即列寬

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

3總結宣告定義(分三種)。

二維陣列,陣列指標,二級指標。(都是指標)

呼叫(一對一,二對二)

陣列指標,二維陣列就寫一級指標即 陣列名.

二級指標就寫二級指標即 (int**)陣列名

在函式中操作元素(注意二級指標,只能用最後的方法)

*(a[i] + j) //代表第 i 行 第 j 列

*( *(a+i) + j) //同上

*( (int * )a +i * n +j )//n表示第二維陣列長度(列寬)

也就是說 3. 是萬能的。

宣告,定義是一樣的。

同時,把元素外層()剝去就代表位址。

————————————————

C 二維陣列傳參

今天寫程式的時候要用到二維陣列作引數傳給乙個函式,我發現將二維陣列作引數進行傳遞還不是想象得那麼簡單裡,但是最後我也解決了遇到的問題,所以這篇文章主要介紹如何處理二維陣列當作引數傳遞的情況,希望大家不至於再在這上面浪費時間。正文 首先,我引用了譚浩強先生編著的 c程式設計 上面的一節原文,它簡要介紹...

二維陣列動態申請與傳參

今天在寫八皇后時遇到了一些小問題,下面整理一下。用二階指標來申請 include include 這裡只做申請 void makedoublearray int row,int col for i 0 i row i free array void main void 用二維陣列指標申請 inclu...

一維陣列及二維陣列的傳參問題

方法一 傳陣列名 編譯器會把這裡的array 解析成指向整型元素的指標,也就是陣列的首位址,方括號裡面的陣列編譯器會忽略,寫不寫都可以,最好不寫,以免引起誤解。void test int array 方法二 傳指標 array是指向陣列的指標,陣列名是首元素的位址。但是在 sizeof 陣列名 和 ...