總結 C語言二維陣列作為函式的引數

2022-03-08 14:02:33 字數 2240 閱讀 9756

前言:今天在實現裝配線排程程式時候,用到了二維陣列,並將其作為函式的引數。在寫程式的時候,遇到一些問題,即二維陣列做函式的引數應該如何正確表示。我寫程式的錯誤如下程式所示:

1 #include 2

void print(int *a[3])3

67intmain()8;

10print(a);

11return0;

12 }

編譯程式時候,在第10行提示錯誤資訊:|10|error: cannot convert 'int (*)[3]' to 'int**' for argument '1' to 'void print(int**)'|。根據錯誤提示我明白了,   int *a[3]表示乙個一維陣列,陣列的資料型別為整型指標(int*),陣列的大小為3,這是因為的優先順序高於*的優先順序。如是我將程式改寫如下,順利通過編譯,得到正確結果。

1 #include 2

void print(int (*a)[3]) //

用括號將指標括起來36

7int

main()8;

10print(a);

11return0;

12 }

下面來總結一下二維陣列作為函式引數該如何表示。

1、二維陣列的概念

在c語言中,二維陣列實際上是一種特殊的一維陣列,它的每個元素也是乙個一維陣列。因此,二維陣列下標形式正確寫法如下:

int arrays[i][j]。陣列元素是按照行順序儲存的,因此當按儲存順序訪問樹時,最右邊的陣列下標(列)變化的最快。

2、二維陣列作為函式引數

規定:如果將二維陣列作為引數傳遞給函式,那麼在函式的引數宣告中必須指明陣列的列數,陣列的行數沒有太大關係,可以指定也可以不指定。因為函式呼叫時傳遞的是乙個指標,它指向由行向量夠成的一維陣列。因此二維陣列作為函式引數正確寫法如下所示:

void func(int array[3][10]);

void func(int array[ ][10]);

因為陣列的行數無關緊要,所以還可以寫成如下形式:

void func(int (*array)[10]);注意*array需要用括號括起來。

這種形式的宣告引數是乙個指標,它指向具有10個元素的一維陣列。因為的優先順序比*的優先順序高,故*array必須用括號括起來,否則變成了

void func(int *array[10]);

這時候引數相當於是宣告了乙個陣列,該陣列有10個元素,其中每個元素都是乙個指向整型物件的指標。

但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:

void func(int array[ ][ ]);

因為從實參傳遞來的是陣列的起始位址,在記憶體中按陣列排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多 少列,不能只指定一維而不指定第二維,下面寫法是錯誤的: 

void func(int array[3][ ]);

實參陣列維數可以大於形引數組,例如形引數組定義為: 

void func(int array[3][10]); 

而實參陣列定義為:int array[5][10];     進行函式呼叫func(array)時,由於陣列在記憶體中是連續存放的,雖然形參與實參陣列行數不對應,但是列數是相同的,具有相同的起始位址,這樣可以訪問到後續的值。如下述程式:

二維陣列作為形參

以下是網上摘抄的一段 首先,我引用了譚浩強先生編著的 c程式設計 上面的一節原文,它簡要介紹了如何將二維陣列作為引數傳遞,原文如下 略有改變,請原諒 原文開始 可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大 明,如 void func i...

C語言 二維陣列作為函式引數

想來學c語言的人,都會覺得陣列並不是很難,一問c語言最難的是什麼?指標?結構體?今天我就以我們認為不難的陣列聊聊。上學的時候老師就告訴我們 乙個就想當與乙個 這句話有問題嘛?答案是沒問題。但是,就是因為這個沒問題,導致工作中有問題。乙個簡單的思考 int arr 4 5 int p arr 請問,有...

C語言二維陣列作為函式引數

設有整型二維陣列a 3 4 如下 0 1 2 3 4 5 6 7 8 9 10 11 它的定義為 int a 3 4 設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。前面介紹過,c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a 0 a 1 a 2 ...