C語言二位陣列

2021-07-22 20:38:43 字數 2134 閱讀 1976

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

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

1 #include 2

3void print_array(int *array, int

len)

49 putchar('\n'

);10}11

12void func(int array[3][10

])13

2021

intmain()22,

25 ,

26 ,

27 ,

28

29};

30func(array);

31return0;

32 }

3. 二維陣列函式賦值

void getpath1(char psztablename[32], byte &bnum)

void main()

二位陣列與指標

include include using namespace std void disparry int a 2 3 int main void c是乙個指標,指向的元素int 3 即arr的行元素 int c 3 arr int p p int arr p指向arr 0 0 也可以說是arr 0...

二位陣列傳參及二位陣列動態分配問題

二位陣列引數傳遞 1.void display1 int arr 4 const int rows cout endl cout endl 2.void display2 int parr 4 const int rows cout endl cout endl parr i 等價於 parr i ...

C 二位陣列做引數傳遞

指標的強大功能,簡直牛逼!include include include using namespace std void func1 int arr 5 傳遞陣列,需生命陣列第二維的大小 void func2 int arr 5 傳遞陣列指標,仍需生命第二維的大小 void func3 int a...