首先你要明白,a是個十六進位制的地址常量,a其實就是a[0]這個數值的地址,也就是a=&a[0] , p這個字母一般把它定義為地址, *p就是p指向的數值的值,你卻把一個值定義為一個地址(*p=a 這種寫法是錯誤的),不符合常理。不能這樣定義, 只可定義為p等於a ,也就是*p等於a[0],p指向a[0], 你所求的是 *(p+2)的值,也就是求 a[3]的值。 因為有個定理因為當p=a,也即*p=a[0]時 那麼 a[1]==*(p+1) a[2]==*(p+2) ..... 依次類推 a[i]==*(p+i) ,你所求的就是 *(p+2) 就是a[2],也就是3. 陰差陽錯,你定義的錯了,結果卻對了,我也有點糊塗了。
這是你的跑圖
https://iknow-pic.cdn.bcebos.com/9f510fb30f2442a757d6849bdf43ad4bd1130237
正確的用法
https://iknow-pic.cdn.bcebos.com/c8177f3e6709c93d2ee269c9913df8dcd10054ff
我知道你的問題了,你寫的沒錯。 你定義的時候,同時定義了陣列和地址變數並且賦值,你用的是逗號隔開的,不是分號,你所謂的*p=a 其實是 int *p=a, 也就是 int *p ; p=a;
一句話,你寫的並沒有錯。只是容易誤解。
首先你要明白,a是個十六進位制的地址常量,a其實就是a[0]這個數值的地址,也就是a=&a[0] , p這個字母一般把它定義為地址, *p就是p指向的數值的值,你卻把一個值定義為一個地址(*p=a 這種寫法是錯誤的),不符合常理。不能這樣定義, 只可定義為p等於a ,也就是*p等於a[0],p指向a[0], 你所求的是 *(p+2)的值,也就是求 a[3]的值。 因為有個定理因為當p=a,也即*p=a[0]時 那麼 a[1]==*(p+1) a[2]==*(p+2) ..... 依次類推 a[i]==*(p+i) ,你所求的就是 *(p+2) 就是a[2],也就是3. 陰差陽錯,你定義的錯了,結果卻對了,我也有點糊塗了。
這是你的跑圖
https://iknow-pic.cdn.bcebos.com/9f510fb30f2442a757d6849bdf43ad4bd1130237
正確的用法
https://iknow-pic.cdn.bcebos.com/c8177f3e6709c93d2ee269c9913df8dcd10054ff
我知道你的問題了,你寫的沒錯。 你定義的時候,同時定義了陣列和地址變數並且賦值,你用的是逗號隔開的,不是分號,你所謂的*p=a 其實是 int *p=a, 也就是 int *p ; p=a;
一句話,你寫的並沒有錯。只是容易誤解。