7.16 我怎樣編寫接受編譯時寬度未知的二維數組的函數 ?

這並非易事。一種辦法是傳入指向 [0][0] 成員的的指針和兩個維數, 然後  ``手工" 模擬數組下標。
    void f2(int *aryp, int nrows, int ncolumns)
    { ... array[i][j] is accessed as aryp[i * ncolumns + j] ... }

這個函數可以用問題 6.15 的數組如下調用:

    f2(&array[0][0], NROWS, NCOLUMNS);

但是, 必須註明的一點是, 用這種方法通過 ``手工" 方式模擬下標的程序 未能嚴格遵循 ANSI C 標準; 根據官方的解釋, 當 x >= NCOLUMNS 時, 訪問 &array[0][0][x] 的結果未定義。

C99 允許變長數組, 一旦接受 C99 擴展的編譯器廣泛流傳以後, VLA 可能是 首選的解決方案。gcc 支持可變數組已經有些時日了。

當你需要使用各種大小的多維數組的函數時, 一種解決方案是象問題  6.13 那樣動態模擬所有的數組。

參見問題 6.15, 6.17, 6.12

參考資料: [ISO, Sec. 6.3.6]; [C9X, Sec. 6.5.5.2]。

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