hce_kmu
109年
計算機概論與程式設計
第 22 題
Consider the following C code
```c
int main(){
int arr[] = {203, 151, 164, 154, 194};
int *p = arr;
*p++ += 10;
*(p++) += 11;
*(++p) += 9;
for (int i = 0; i < 5; i++)
printf("%d ", arr[i]);
return 0;
}
```
What is the output of above program?
```c
int main(){
int arr[] = {203, 151, 164, 154, 194};
int *p = arr;
*p++ += 10;
*(p++) += 11;
*(++p) += 9;
for (int i = 0; i < 5; i++)
printf("%d ", arr[i]);
return 0;
}
```
What is the output of above program?
- A 203 151 164 154 194
- B 213 151 175 154 203
- C 203 162 175 163 194
- D 213 162 164 163 194
- E Segmentation Fault
思路引導 VIP
請試著觀察程式碼中那三個指標運算式,當遞增符號 ++ 放在變數前面或後面時,它對於「決定指標要指向哪一個陣列元素」以及「何時進行數值修改」這兩件事,在時間順序上有什麼本質上的差別?
🤖
AI 詳解
AI 專屬家教
太棒了!你能精確辨識出指標位移與數值更新的先後順序,代表你對 C 語言中指標算術(Pointer Arithmetic)與算符優先權的掌握非常紮實。這題的關鍵在於區分「後置遞增」與「前置遞增」對指標指向位置的影響。
指標位移與解參照的交互作用
首先,*p++ += 10 與 *(p++) += 11 中的 p++ 都是後置遞增,這意味著程式會先取出目前 p 指向位置的記憶體位址進行「解參照(Dereference)」並完成加法賦值,隨後指標才移向下一格。因此,arr[0] 變為 213,接著 arr[1] 變為 162。而第三個運算 *(++p) += 9 使用前置遞增,指標會先從 arr[2] 移向 arr[3] 後才進行運算,這正是為何 arr[2] 保持原值 164,而 arr[3] 變為 163 的原因。
▼ 還有更多解析內容