GESP 四级 · GESP 202603 C++ 四级 第 4 题

选择题 · 答案 B

← 整套速查表 GESP 四级 全部真题

题目

执行下面程序后,输出为( )。

void fun(int a, int &b, int *c){
    a += 1;
    b += 2;
    *c += 3;
}

int main(){
    int x = 1, y = 1, z = 1;
    fun(x, y, &z);
    cout << x << " " << y << " " << z;
}
答案:B

解题思维

答案B。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。

常见错误

指针和数组追踪时画内存布局图可以大大简化理解。

详细解析(节选)

【考点】参数传递方式|值传递、引用传递、指针传递

本题出自GESP四级"数据类型与基本算法"模块,核心考察C++参数传递机制。命题人故意混用三种传递方式,卡住的是多数考生对"值传递、引用传递、指针传递"本质区别的模糊认知——他们往往只关注结果,却不懂变量在函数内外的关联关系。

解题关键在于识别函数形参类型:int a是值传递,只影响局部副本;int &b是引用传递,直接修改实参y;int *c是指针传递,通过地址修改z。通法是:先看形参声明,再看实参传入,最后看函数内操作——值传不改原值,引用传改原值,指针传改原值。这类题本质是考察"函数参数如何与外部变量建立关联"。

陷阱设计精妙:A项把a++的局部修改误认为影响x,是值传递陷阱;C项把b++的引用修改误认为不影响y,是引用传递陷阱;D项把*c++的指针操作误认为不影响z,是指针陷阱。最阴险的是"*c++"——指针解引用本身不修改原值,但++操作会,考生若只记得"指针传值",就会选D。命题人利用"指针是地址"与"解引用是取值"的混淆,专门卡住死记硬背结论的人。

反命题思维:若把fun参数改为fun(int &a, int b, int *c),则x变2、y不变、z变4,输出应为2 1 4;若把y改成&y,则y变3、x不变、z变4,输出1 3 4。刷到类似题时,先问自己"形参是值还是引用还是指针?"——这才是破题关键。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断