7.17 我怎樣在函數參數傳遞時混用靜態和動態多維數組 ?

沒有完美的方法。假設有如下聲明
	int array[NROWS][NCOLUMNS];
	int **array1;		/* 不齊的   */
	int **array2;		/* 連續的   */
	int *array3;		 /* "變平的" */
	int (*array4)[NCOLUMNS];
指針的初始值如問題 6.13 的程序片段, 函數聲明如下
    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) 並不完全符合標準; 參見問題 6.16

如果你能理解為何上述調用可行且必須這樣書寫, 而未列出的組合不行, 那麼你對 C  語言中的數組和指針就有了好的理解了。

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

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)