C語言中指標的深入學習之指標與陣列之間的恩怨
阿新 • • 發佈:2018-12-17
序言:
我總是在想到底什麼樣的問題才是值得寫一篇部落格來記錄的,什麼高深的學術?顯然對於筆者來說並不適合,我只是記錄自己在所學之時覺得有價值的問題,這樣部落格也變得有意義了;
a與&a的區別(指標加減的理解)
注意此處是建立在定義int a[5] 的基礎上;此處的a不是字元; 分析下邊程式碼:
main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a+1)
printf("%d,%d\n",*(a+1))
}
千萬別以為上邊程式碼十分簡單,其實不然,最後終端上打印出來的值到底是多少那? 對指標進行加一操作,得到的是下一個元素的地址,而不是原有地址加一。所以一個型別為 T 的指標的移動,以sizeof(T)為移動單位。
(int)(&a+1) :則是把上一步計算出來的地址,強制轉換為int *型別,賦給ptr;
**(a+1)*:a,&a的值是一樣的,但是意思並不一樣,a是陣列首個元素的首地址,也就是a[0]的地址,&a是陣列的首地址,a+1是陣列下一個元素的首地址,即a[1]的地址,&a+1是下一個陣列的首地址,可以理解為ptr指的是a[5],雖然沒有第6個元素,但是可以這麼理解; 所以上邊題的答案是2,5;
總結
a與&a雖然值相同,但是本質不同,尤其是在進行地址加假的時候,最容易混淆;