7.2 可是我聽說 char a[ ] 和 char *a 是一樣的。

並非如此。(你所聽說的應該跟函數的形式參數有關;參見問題  6.4) 數組不是指針。 數組定義 char a[6] 請求預留 6 個 字符的位置, 並用名稱 ``a" 表示。也就是說, 有一個稱為 ``a" 的位置, 可以放入 6 個字符。 而指針申明 char *p, 請求一個位置放置一個指 針, 用名稱 ``p" 表示。 這個指針幾乎可以指向任何位置: 任何字符和 任何連續的字符, 或者哪裡也不指(參見問題 5.1 和  1.10)。

一個圖形勝過千言萬語。聲明

    char a[] = "hello";
    char *p = "world";
將會初始化下圖所示的數據結果:
       +---+---+---+---+---+---+
    a: | h | e | l | l | o |\0 |
       +---+---+---+---+---+---+
       +-----+     +---+---+---+---+---+---+
    p: |  *======> | w | o | r | l | d |\0 |
       +-----+     +---+---+---+---+---+---+

根據 x 是數組還是指針, 類似 x[3] 這樣的引用會生成不同的代碼。 認識到這一點大有裨益。以上面的聲明為例, 當編譯器看到表達式  a[3] 的時候, 它生成代碼從 a 的位置開始跳過 3 個, 然後取出那個 字符. 如果它看到 p[3], 它生成代碼找到 ``p" 的位置, 取出其中的指 針值, 在指針上加 3 然後取出指向的字符。換言之, a[3] 是 名為 a 的對象 (的起始位置) 之後 3 個位置的值, 而 p[3] 是  p 指向的對象的 3 個位置之後的值. 在上例中, a[3] 和  p[3] 碰巧都是 'l' , 但是編譯器到達那裡的途徑不盡相同。 本質的區別在於類似 a 的數組和類似 p 的指針一旦在表達式中出現就會 按照不同的方法計算, 不論它們是否有下標。下一問題繼續深入解釋。 參見問題 1.13

參考資料: [K&R2, Sec. 5.5 p. 104]; [CT&P, Sec. 4.5 pp. 64-5]。

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