我怎樣在函式引數傳遞時混用靜態和動態多維陣列?

2021-06-22 08:58:26 字數 1624 閱讀 7137

我怎樣在函式引數傳遞時混用靜態和動態多維陣列?

沒有完美的方法。假設有如下宣告

int  array[nrows][ncolumns];

int  **array1;

/*  不齊的 */

int  **array2;

/*  連續的 */

int  *array3;

/*  "變平的"  */

int  (*array4)[ncolumns];

指標的初始值如問題的程式片段, 函式宣告如下

void  f1a(int  a[ncolumns],  int  nrows,  int  ncolumns);

void  f1b(int  (*a)[ncolumns],  int  nrows,  int  ncolumns);

void  f2(int  *aryp,  int  nrows,  int  ncolumns);

void  f3(int  **pp,  int  nrows,  int  ncolumns);

其中f1a() 和f1b() 接受傳統的二維陣列, f2() 接受「扁平的」 二維陣列, f3() 接受指標的指標模擬的陣列(參見問題6.15 和6.16), 下面的呼叫應該可以如願執行:

f1a(array,  nrows,  ncolumns);

f1b(array,  nrows,  ncolumns);

f1a(array4,  nrows,  ncolumns);

f1b(array4,  nrows,  ncolumns);

f2(&array[0][0],  nrows,  ncolumns);

f2(*array,  nrows,  ncolumns);

f2(*array2,  nrows,  ncolumns);

f2(array3,  nrows,  ncolumns);

f2(*array4,  nrows,  ncolumns);

f3(array1,  nrows,  ncolumns);

f3(array2,  nrows,  ncolumns);

下面的呼叫在大多數系統上可能可行, 但是有可疑的型別轉換, 而且只有動態ncolumns 和靜態ncolumns 匹配才行:

f1a((int  (*)[ncolumns])(*array2),  nrows,  ncolumns);

f1a((int  (*)[ncolumns])(*array2),  nrows,  ncolumns);

f1b((int  (*)[ncolumns])array3,  nrows,  ncolumns);

f1b((int  (*)[ncolumns])array3,  nrows,  ncolumns);

同時必須注意向f2() 傳遞&array[0][0] (或者等價的*array) 並不完全符合標準; 參見問題。

如果你能理解為何上述呼叫可行且必須這樣書寫, 而未列出的組合不行, 那麼你對c 語言中的陣列和指標就有了很好的理解了。

為免受這些東西的困惑, 一種使用各種大小的多維陣列的辦法是令它們「全部」 動態分配, 如問題6.13 所述。如果沒有靜態多維陣列—— 如果所有的陣列都按問題 的array1 和array2 分配—— 那麼所有的函式都可以寫成f3() 的形式。

函式的引數傳遞位陣列時,如何傳遞

初學者剛學完陣列後,需要將陣列作為引數傳遞時,會直接將陣列作為引數傳遞,實際上陣列作為形參傳遞時,是以指標傳遞的。void print int a void print int a 儘管形式不同,但是上面兩個函式是等價的,每個函式的唯一形參都是 int 型別 void print const cha...

WINMAIN函式的引數是怎樣傳遞的

int winapi winmain hinstance hinstance,hinstance hprevinstance,lpstr lpcmdline,int ncmdshow 引數 winmain函式接收4個引數,這些引數都是在系統呼叫winmain函式時,傳遞給應用程式的。hinstanc...

C在引數傳遞時遇到的問題

題目大概如下 void findqueen int count findqueen count int totalnqueens int n 1.findqueen 的引數傳遞 第一次呼叫,此時count為乙個值,用 將位址傳給函式,函式用指標儲存位址,在函式中count即為指標 位址 count為...