跳转到内容

编程基础/传值调用与传引用调用

来自维基教科书,开放的书籍,为开放的世界

在传值调用中,参数在函数中充当一个新的局部变量,初始化为参数的值(参数的局部(隔离)副本)。在传引用调用中,调用者提供的参数变量可能会受到被调用函数中操作的影响。[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++ 默认 在被调用函数中使用 &parameter
C# 默认 在调用和被调用函数中使用 ref parameter
Java 默认 适用于数组和对象
JavaScript 默认 适用于数组和对象
Python 默认 适用于数组(列表)和可变对象

数组和对象将在后面的章节中介绍。

关键词

[编辑 | 编辑源代码]
传引用调用
调用函数传递的参数可以被被调用函数修改。
传值调用
调用函数传递的参数不能被被调用函数修改。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书