面试题答案
一键面试按引用传递修改实参的原理
在C++ 中,按引用传递本质上是传递实参的别名。当我们声明一个引用参数时,它实际上是实参的另一个名字,与实参共享相同的内存地址。所以对引用参数的任何修改,实际上就是对实参的修改,因为它们指向同一块内存区域。
代码示例
#include <iostream>
// 通过引用传递一个整数,在函数内将其值翻倍
void doubleValue(int& num) {
num *= 2;
}
int main() {
int value = 5;
std::cout << "Before function call: value = " << value << std::endl;
doubleValue(value);
std::cout << "After function call: value = " << value << std::endl;
return 0;
}
函数调用过程中栈的变化情况
- 调用函数前:
- 主函数
main
的栈帧已经存在,栈中包含main
函数的局部变量value
,其值为5。
- 主函数
- 调用
doubleValue
函数时:- 系统在栈上为
doubleValue
函数分配一个新的栈帧。 doubleValue
函数的参数num
(引用类型)并不需要额外的空间来存储值,因为它是main
函数中value
的别名,直接指向value
的内存地址。
- 系统在栈上为
doubleValue
函数执行时:- 在
doubleValue
函数栈帧内执行num *= 2
,由于num
是value
的别名,实际上修改的是main
函数栈帧中value
的值,value
变为10。
- 在
doubleValue
函数返回后:doubleValue
函数的栈帧被销毁。- 回到
main
函数,此时main
函数栈帧中的value
值已经被修改为10,继续执行后续代码输出修改后的值。