7.15 當我向一個接受指針的指針的函數傳入二維數組的時候, 編譯器報錯了。

數組蛻化為指針的規則 (參見問題 6.3不能遞歸應用。 數組的數組 (即 C 語言中的二維數組) 蛻化為數組的指針, 而不是指針的指針。 數組指針常常令人困惑, 需要小心對待; 參見問題 6.10

如果你向函數傳遞二位數組:

    int array[NROWS][NCOLUMNS];
    f(array);
那麼函數的聲明必須匹配:
    void f(int a[][NCOLUMNS])
    { ... }
或者
    void f(int (*ap)[NCOLUMNS]) /* ap 是個數組指針 */
    { ... }

在第一個聲明中, 編譯器進行了通常的從 ``數組的數組" 到 ``數組的指針"  的隱式轉換 (參見問題 6.3 和 6.4); 第二種形式中的指針 定義顯而易見。因為被調函數並不為數組分配地址, 所以它並不需要知道總的 大小, 所以行數 NROWS 可以省略。但數組的寬度依然重要, 所以列維度  NCOLUMNS (對於三維或多維數組, 相關的維度) 必須保留。

如果一個函數已經定義為接受指針的指針, 那麼幾乎可以肯定直接向它傳入 二維數組毫無意義。

參見問題 6.9 和 6.12

參考資料: [K&R1, Sec. 5.10 p. 110]; [K&R2, Sec. 5.9 p. 113]; [H&S, Sec. 5.4.3 p. 126]。

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