下面程序运行的结果是( )。
void increaseA(int x) {
x++;
}
void increaseB(int* p) {
(*p)++;
}
int main() {
int a = 5;
increaseA(a);
cout << a << " ";
increaseB(&a);
cout << a;
}答案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。学生要意识到指针和引用的区别。