C語言中指針的深入學習之指針與數組之間的恩怨

序言:

我總是在想到底什麼樣的問題纔是值得寫一篇博客來記錄的,什麼高深的學術?顯然對於筆者來說並不適合,我只是記錄自己在所學之時覺得有價值的問題,這樣博客也變得有意義了;

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雖然值相同,但是本質不同,尤其是在進行地址加假的時候,最容易混淆;

a是數組首個元素的首地址,也就是a[0]的地址,&a是數組的首地址,a+1是數組下一個元素的首地址,即a[1]的地址,&a+1是下一個數組的首地址,可以理解a[5];

聲明,這裏的學習是通過《c語言深度解剖》瞭解到的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章