農會 資訊管理類程式設計110 年第 24 題單選題
以下為C語言程式,請問執行後的結果,下列何者正確?
#include <iostream>
using namespace std;
void test1(int a)
{
a+=3;
}
void test2(int* a)
{
*a+=3;
}
int main()
{
int a=5, b=6;
test1(a);
test2(&b);
return 0;
}
A、D正確答案
本題雖標示C語言實為C++語法。測驗函式引數傳遞機制:傳值不改變原變數,傳指標會修改原變數。
為什麼答案是 A、D
test1 採用傳值呼叫,引數 a 的改變不會影響 main 函式中的原變數 a,故 a 仍為 5。
考點:傳值呼叫考點:傳址呼叫
載入中…
完整詳解
Pro · 無限重點 本題雖標示C語言實為C++語法。測驗函式引數傳遞機制:傳值不改變原變數,傳指標會修改原變數。
看到 test1(int a) 是傳值,原變數不變;test2(int* a) 是傳指標,原變數會被修改。
逐選項分析
A傳值呼叫✓ 正確
test1 採用傳值呼叫,引數 a 的改變不會影響 main 函式中的原變數 a,故 a 仍為 5。
B傳值呼叫✕ 陷阱
誤以為傳值呼叫會改變原變數,將 5 加上 3 得到 8,但實際上區域變數的修改不會回傳。
C傳址呼叫✕ 陷阱
誤以為傳址呼叫不會改變原變數,認為 b 維持原值 6,但實際上指標解參考後會修改原記憶體的值。
D傳址呼叫✓ 正確
test2 採用傳址呼叫,透過指標修改原變數 b 的記憶體內容,6 加上 3 後 b 變為 9。
引數傳遞機制比較
| 傳遞方式 | 函式定義 | 呼叫方式 | 是否改變原變數 |
|---|
| 傳值呼叫 (Pass by Value) | void func(int x) | func(a) | 否 (修改區域副本) |
| 傳址呼叫 (Pass by Pointer) | void func(int* x) | func(&a) | 是 (修改原記憶體位址) |
| 傳參考呼叫 (Pass by Reference) | void func(int& x) | func(a) | 是 (原變數的別名) |
考生常將「傳值」與「傳址」的效果混淆。看到函式內有 a+=3 就直覺選 a=8,卻忽略了 test1 是傳值呼叫,修改的只是區域變數副本,無法影響 main 函式的原變數。