二維陣列 作為函式引數

2021-07-24 06:34:10 字數 2104 閱讀 7526

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

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)時,由於陣列在記憶體中是連續存放的,雖然形參與實參陣列行數不對應,但是列數是相同的,具有相同的起始位址,這樣可以訪問到後續的值。如下述程式:

linux C 二維陣列 作為函式引數

c語言中怎麼用二維陣列作為函式引數 可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大 明,如 void func int array 3 10 void func int array 10 二者都是合法而且等價,但是不能把第二維或者更高維的...

C C 一維二維陣列作為函式引數

1.一維陣列傳參 呼叫函式時只傳陣列名 func a void func int a 10 void func int a 2.二維陣列傳參 呼叫函式時只傳陣列名 func a 注意 二維陣列作為引數傳遞給函式,必須指明陣列的列數 void func int a 3 10 void func int...

專題 二維陣列作為函式引數傳遞

include 方法1 第一維的長度可以不指定 但必須指定第二維的長度 void print a int a 5 int n,int m 方法2 指向乙個有5個元素一維陣列的指標 void print b int a 5 int n,int m 方法3 利用陣列是順序儲存的特性,通過降維來訪問原陣列...