序言:
我總是在想到底什麼樣的問題纔是值得寫一篇博客來記錄的,什麼高深的學術?顯然對於筆者來說並不適合,我只是記錄自己在所學之時覺得有價值的問題,這樣博客也變得有意義了;
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)爲移動單位。
對上題來說,a是一個一維數組,數組中有五個元素;ptr是一個int類型的指針,並指向此數組;
&a+1 :取數組a的首地址,該地址的值加上sizeof(a),即&a+5*sizeof(int),也就是下一個數組的首地址,顯然當前指針已經越過了數組的界限。
(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雖然值相同,但是本質不同,尤其是在進行地址加假的時候,最容易混淆;