E大已經把正常的答案填完了.
我從我理解的標準角度來看這個題目:
指標對整數的算術運算有兩個條件:
條件1. 指向的東西是某陣列的元素
條件2. 移動後的位置指向同一個陣列內的元素或者指向陣列後一個元素
備註: 雖然可以指向陣列後一個元素, 但對該指標取值是未定義行為
此外計算指標指向的位址需要很多假設. 這裡假設比較常見的記憶體模型並標注 [指標型態]
畢竟我們真的不需要知道指標裡面的位址是怎麼存的.
※ 引述《leo19866 (ice)》之銘言:
: 1.pa[3]
pa[3] 相等於 *(pa+3)
pa 指向 a[1], 則 pa+3 指向 a[4]
雖然這陣列沒有 a[4] , 但是指向 a[4] 是合法的 (條件2)
不過 *(pa+3) 是 a[4] 本身, 但 a[4] 並不存在.
所以 *(pa+3) 是 "未定義行為" (備註)
: 2.pa+2
pa+2 指向 a[3], 其值為 a[3] 的位址: 160 + 2 * sizeof(double) [指標型態]
: 3.pa+i
i == 4, 所以 pa+i 為 pa+4
pa 指向 a[1], pa+4 應該要指向 a[5]
但是這個指標算術運算結果超過陣列大小後一格. 是 "未定義行為" (條件2)
: 4.ppa+i
ppa 指向的是 pa 而不是一個陣列的某元素. 對其作指標算術運算是 "未定義行為" (條件1)
: 5.*pa+i
pa 指向 a[1], 則 *pa 為 a[1], 即 20.0
*pa+i == a[1]+4 == 20.0 + 4 == 24.0
: 6.*(pa+2)
pa 指向 a[1], pa+2 指向 a[3], *(pa+2) 為 a[3], 即 40.0
: 7.*ppa
ppa 指向 pa, *ppa 為 pa, 即 a[1] 的位址: 160 [指標型態]
: 8.**ppa+1
ppa 指向 pa, *ppa 為 pa
pa 指向 a[1], *pa 為 a[1]
**ppa+1 == *pa+1 == a[1]+1 == 20.0+1 == 21.0
: 9.*ppa+1
ppa 指向 pa, *ppa 為 pa
pa 指向 a[1], pa+1 指向 a[2]
*ppa+1 == pa+1 == a[2] 的位址: 160 + sizeof(double) [指標型態]
: 10.*(*ppa+1)
同上, *ppa+1 指向 a[2]
所以 *(*ppa+1) 為 a[2] 即 30.0
: 如果能解釋一下更好
: 在此先謝過了
我也不確定我的理解是否正確.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.148
※ 編輯: Feis 來自: 140.112.29.148 (11/25 17:10)