對於編譯器而言,一個數組就是一個地址,一個指標就是一個地址的地址。
什麼時候數組和指標是相同的:
1、運算式中的數組名(與聲明不同)被編譯器當作一個指向該數組第一個元素的指標(在運算式中,指標和數組是可以互換的,因為它們在編譯器裡的最終形式都是指標,並且都可以去下標操作.例對數組的引用如a[i]在編譯時間總是被編譯器改寫成*(a+i)的形式);
2、下標總是與指標的位移量相同;
3、在函數參數的聲明中,數組名被編譯器當作指向該數組第一個元素的指標。
另外,對第一點的解釋:存在幾個極少見的例外,就是把數組當作一個整體來使用。
如下列情況:
1、數組作為sizeof的運算元-顯然 此時需要的是整個數組的大小,而不是指向第一個元素的大小;
2、使用&操作符取數組的地址(原因:一個數組就是一個地址,一個指標就是一個地址的地址);
3、數組是一個字串(或寬字元串)常量初始值。
編譯器自動把下標值的步長調整到數組元素的大小。
對起始地址執行加法操作之前,編譯器會負責計算每次增加的步長。這就是為什麼指標總是有類型限制,每個指標只能指向同一種類型的原因所在-因為編譯器需要知道對指標進行解除引用操作時應該取幾個位元組,以及每個下標的步長應取幾個位元組。
步長計算方法:位移量乘以每個數組元素所佔位元組數,計算結果就是位移數組起始地址的實際位元組數。步長因子常常是2的乘方(如int是4個位元組,double是8個位元組)這樣編譯器在計算時就可以使用快速的左移位元運算,而不是相對緩慢的加法運算。
C語言把數組下標改寫成指標位移量的根本原因是是真和位移量是底層硬體所使用的基本模型。亦即是,在底層硬體中,都是使用指標來訪問資料的(如前面說的,編譯器都會把改寫成指標形式)。
對於多維陣列的方位ca[i][j],編譯為*(*(ca+i)+j)。
只有字串常量才可以初始化指標數組,指標數組不能由非字串的類型直接初始化。
int (*ga)[20] 是被翻譯成一個指向20個元素的的int數組的指標,而不是一個20個指標元素的數組。
也可以參考本博博文 多維陣列(數組的數組)及指標對其訪問:http://www.cnblogs.com/ziwuge/archive/2011/06/11/2078567.html