在 C 語言中,對陣列的參照總是可以寫成對指標的參照,而且也確實存在一種指標和陣列定義完全相同的上下文環境。因此,給大家帶來指標和陣列應該是可以互換的錯覺,大家也會自然地歸納並假定在所有的情況下陣列和指標都是等同的。實際上,並非所有情況下都是如此。
簡單地講,陣列就是陣列,指標就是指標,它們之間沒有任何關係,只是經常穿著相似的衣服來迷惑你罷了。因此,“陣列和指標是相同的”這種說法是危險的,是不完全正確的。
回顧前面對於左值和右值的討論,編譯器為每個變數分配一個地址(左值),這個地址在編譯時可知,而且該變數在執行時一直儲存於這個地址。相反,儲存於變數中的值(右值)只有在執行時才可知。如果需要用到變數中儲存的值,編譯器就發出指令從指定地址讀入變數值並將它存於暫存器中。
這裡需要注意的是,由於編譯器為每個變數分配一個地址(左值),這個地址在編譯時可知,因此,如果編譯器需要一個地址(可能還需要加上偏移量)來執行某種操作,它就可以直接進行操作,並不需要增加指令首先取得具體的地址。範例程式碼如下所示:
char a[6]="hello";
...
c=a[i];
對於上面的範例程式碼,在定義陣列 a 時,編譯器就在某個地方儲存了 a 的首元素的首地址,這裡假設地址為 10000(即 a 是一個地址,編譯器會為陣列 a 分配一個空間,但不會為 a 本身分配空間),如圖 1 所示。
圖 1 對陣列下標的參照