GESP 四级 · GESP 202509 C++ 四级 第 6 题

选择题 · 答案 C · 考点:函数、指针与内存

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

题目

下面程序运行的结果是( )。

void increaseA(int x) {
    x++;
}

void increaseB(int* p) {
    (*p)++;
}

int main() {
    int a = 5;
    increaseA(a);
    cout << a << " ";
    increaseB(&a);
    cout << a;
}
答案:C

考点

函数指针与内存

解题思维

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

常见错误

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

详细解析(节选)

【考点】函数|值传递与引用传递|指针

【解题思维】看到题先想参数传递方式——increaseA(int x)是值传递,x是a的拷贝,x++不影响a;increaseB(int* p)是引用传递(通过指针),(*p)++直接修改a。所以第一次输出a还是5,第二次输出6。选C。

【陷阱拆解】错误选项B、D都是把两次输出都当成6或5,忽略了值传递不修改原变量。命题人利用学生混淆"修改局部变量"和"修改原变量"的误区。另外,increaseB用的是指针,学生会误以为它也是值传递,其实是指针传递了地址,所以(*p)++修改了a。细节上,increaseA的参数名是x,但x是拷贝;increaseB的参数是p,p是地址,(*p)++修改a。

【反命题思维】如果把increaseB改成void increaseC(int& p),那就是引用传递,效果一样;如果改成void increaseD(int* p)但内部p++,那p只是指针变量本身自增,不影响a。学生要意识到指针和引用的区别。

同考点真题

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