7.3 那麼, 在 C 語言中 ``指針和數組等價" 到底是什麼意思 ?

在 C 語言中對數組和指針的困惑多數都來自這句話。說數組和指針 ``等價"  不表示它們相同, 甚至也不能互換。它的意思是說數組和指針的算法定義 可以用指針方便的訪問數組或者模擬數組。

特別地, 等價的基礎來自這個關鍵定義:

一個 T 的數組類型的左值如果出現在表達式中會蛻變為一個指向數組第一個 成員的指針(除了三種例外情況); 結果指針的類型是 T 的指針。

這就是說, 一旦數組出現在表達式中, 編譯器會隱式地生成一個指向數組第 一個成員地指針, 就像程序員寫出了 &a[0] 一樣。例外的情況是, 數組為  sizeof 或 & 操作符的操作數, 或者為字符數組的字符串初始值。

作為這個這個定義的後果, 編譯器並那麼不嚴格區分數組下標操作符和指針。 在形如 a[i] 的表達式中, 根據上邊的規則, 數組蛻化為指針然後按照指針變 量的方式如 p[i] 那樣尋址, 如問題 6.2 所述, 儘管最終的內存訪問 並不一樣。 如果你把數組地址賦給指針:

    p = a;
那麼 p[3] 和 a[3] 將會訪問同樣的成員。

參見問題 6.6 和 6.11

參考資料: [K&R1, Sec. 5.3 pp. 93-6]; [K&R2, Sec. 5.3 p. 99]; [ISO, Sec. 6.2.2.1, Sec. 6.3.2.1, Sec. 6.3.6]; [H&S, Sec. 5.4.1 p. 124]。

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