普考-資訊處理計算機概要104 年第 22 題單選題
下列是 C 語言之函數 fun2,當此函數被呼叫時,傳入參數 num1 和 num2 分別為 5 和 55,請問此函數執行完畢後,num1 和 num2 分別為多少? void fun2 (int *num1, int *num2) { int num3 = *num1; *num1 = *num2; *num2 = num3; }
A55 和 5正確答案
B5 和 55
C5 和 5
D55 和 55
A正確答案
這是經典的 pointer swap(指標交換)函數,透過指標交換兩變數的值,5 和 55 交換後變成 55 和 5。
為什麼答案是 A
正解。num3 先暫存 num1 的值 5,接著把 num2 的值 55 寫入 num1,最後把 num3 的 5 寫入 num2,完成交換。因為傳的是指標,變動會反映到原變數。
載入中…
完整詳解
Pro · 無限重點 這是經典的 pointer swap(指標交換)函數,透過指標交換兩變數的值,5 和 55 交換後變成 55 和 5。
看到 temp = *a; *a = *b; *b = temp; → 秒判交換函數,直接選「兩數互換」的選項。
逐選項分析
A✓ 正確
正解。num3 先暫存 num1 的值 5,接著把 num2 的值 55 寫入 num1,最後把 num3 的 5 寫入 num2,完成交換。因為傳的是指標,變動會反映到原變數。
B✕ 陷阱
陷阱選項。若誤以為 C 是 call by value(傳值),函數內變動不會影響外部,就會選此答案。但此題傳的是 int* 指標,屬 call by address,會真的改到原變數。
C✕
錯誤。若忘了用暫存變數 num3,直接 *num1 = *num2; *num2 = *num1; 才會兩個都變 55 或 5。但本題有正確使用 num3 暫存,不會發生覆蓋。
D✕
錯誤。同 C 的錯誤思路反向,但本題程式碼邏輯正確,不會兩個都變成 55。
交換函數執行步驟追蹤
| 步驟 | 敘述 | *num1 | *num2 | num3 |
|---|
| 初始 | 傳入參數 | 5 | 55 | - |
| ① | num3 = *num1 | 5 | 55 | 5 |
| ② | *num1 = *num2 | 55 | 55 | 5 |
| ③ | *num2 = num3 | 55 | 5 | 5 |
最容易掉入 B 選項陷阱:誤以為函數改不到外部變數。關鍵在於參數是 int *num1(指標型別),呼叫端必須傳 &變數,函數內透過 *num1 解參考後的修改會直接寫入原記憶體位置,因此交換成立。