前言:今天在實現裝配線排程程式時候,用到了二維陣列,並將其作為函式的引數。在寫程式的時候,遇到一些問題,即二維陣列做函式的引數應該如何正確表示。我寫程式的錯誤如下程式所示:
1 #include 2編譯程式時候,在第10行提示錯誤資訊:|10|error: cannot convert 'int (*)[3]' to 'int**' for argument '1' to 'void print(int**)'|。void print(int *a[3])3
67intmain()8;
10print(a);
11return0;
12 }
根據錯誤提示我明白了, 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 23void 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...