1. 程式人生 > >C語言中指標的深入學習之指標與陣列之間的恩怨

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語言深度解剖》瞭解到的