這裡沒有定義數組指針,為什麼會出現數組,只是僅僅定義一個指針而已,為什麼可以當數組用?

看到沒,結果是一樣的。

你甚至還可以這樣寫:

int v4 = 3[p]; // 通過指針取

說白了你對數組進行取值的時候,編譯器是將首地址加上數組中元素的數據類型所佔的大小乘以需要偏移的量計算對應值的地址的,如果上面數組的起始地址是 0x07c00, 而這個數組中元素的數據類型是 int,暫且將 int 所佔的空間規定為四個位元組, 那麼第三個元素的地址就是 0x07c00 + 4*4,這樣就求得了第三個元素的地址,至於為什麼直接寫 p[i] 就可以取到值,編譯器會根據 p 中存放的地址和當前的數據類型(這裡以4個位元組為一個單位)偏移指定的 i 個單位,自然就取到值了,這些都是為了寫程序的時候方便。所以 3[p] 這種寫法也沒問題,只不過"偏移"的值換成了 p 中的值(地址)而已。

不管是 a[i] 這種方式取值也好,p[i],*(p+i),i[p],也好,本質上都是根據數組起始地址加上偏移地址計算元素位置的;這個你學彙編的時候應該就能更加清晰了。


int *p;

這個是一個指針,準確說的是,這個是一個可以存地址的變數,這個地址存的內容是一個int類型。

int arr[3][4];

這個定義的是一個數組,這個數組有 3x4 個元素,每個數組元素是int,arr代表這個數組的集合。

p = arr[0][0];

p 保存的是int類型的地址,arr[0][0]是int類型,所以上面的語法沒有任何問題,把數組的首元素的地址賦值給p。

*(p+i)

這個其實就是地址偏移,它的意思是

*(arr[0][0] + sizeof(int)*i)

通過這種方法剛好偏移到數組下標對應的元素,但是這並不代表數組和指針有一腿。


推薦閱讀:
相关文章