我怎樣在函式引數傳遞時混用靜態和動態多維陣列?
沒有完美的方法。假設有如下宣告
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為...