编程基础/传值调用与传引用调用
外观
< 编程基础
在传值调用中,参数在函数中充当一个新的局部变量,初始化为参数的值(参数的局部(隔离)副本)。在传引用调用中,调用者提供的参数变量可能会受到被调用函数中操作的影响。[1]
在大多数当前编程语言中,参数默认情况下按值传递,参数为调用值的副本。参数是隔离的,函数可以自由地更改参数值,而不会对调用函数产生任何影响。考虑以下伪代码
Function Main Declare Real fahrenheit Assign fahrenheit = 100 Output "Main fahrenheit = " & fahrenheit Call ChangeFahrenheit(fahrenheit) Output "Main fahrenheit = " & fahrenheit End Function ChangeFahrenheit (Real fahrenheit) Output "ChangeFahrenheit fahrenheit = " & fahrenheit Assign fahrenheit = 0 Output "ChangeFahrenheit fahrenheit = " & fahrenheit End
Main fahrenheit = 100 ChangeFahrenheit fahrenheit = 100 ChangeFahrenheit fahrenheit = 0 Main fahrenheit = 100
用英文来说,Main 函数将值 100 赋值给变量 fahrenheit,显示该值,然后调用 ChangeFahrenheit 传递该值的副本。被调用函数显示参数,更改参数,然后再次显示参数。执行返回调用函数,Main 显示原始变量的值。在传值调用中,调用函数中的变量 fahrenheit 和被调用函数中的参数 fahrenheit 引用不同的内存地址,被调用函数无法更改调用函数中变量的值。
如果编程语言使用或支持传引用调用,则调用函数中的变量和被调用函数中的参数引用相同的内存地址,被调用函数可以更改调用函数中变量的值。使用与上面相同的代码示例,传引用调用的输出将更改为
Main fahrenheit = 100 ChangeFahrenheit fahrenheit = 100 ChangeFahrenheit fahrenheit = 0 Main fahrenheit = 0
支持传值调用和传引用调用的编程语言使用某种类型的关键字或符号来指示正在使用哪种参数传递方法。
语言 | 传值调用 | 传引用调用 |
---|---|---|
C++ | 默认 | 在被调用函数中使用 ¶meter |
C# | 默认 | 在调用和被调用函数中使用 ref parameter |
Java | 默认 | 适用于数组和对象 |
JavaScript | 默认 | 适用于数组和对象 |
Python | 默认 | 适用于数组(列表)和可变对象 |
数组和对象将在后面的章节中介绍。
- 传引用调用
- 调用函数传递的参数可以被被调用函数修改。
- 传值调用
- 调用函数传递的参数不能被被调用函数修改。