🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 按值致电与按引用致电之间的区别 > 原文: [https://www.guru99.com/call-by-value-vs-call-by-reference.html](https://www.guru99.com/call-by-value-vs-call-by-reference.html) 在编程语言中,可以通过两种方式调用函数:称为按值调用和按引用调用。 在本教程中,您将学习, * [什么是按值调用方法?](#1) * [什么是按引用调用方法?](#2) * [按值方法](#3)调用的示例 * [通过引用方法](#4)进行调用的示例 * [按值调用与按引用调用](#5) * [使用按值调用方法](#6)的优点 * [使用按参考方法](#7)致电的优势 * [使用按值调用](#8)的缺点 * [使用引用方法](#9)进行呼叫的缺点 ## 什么是按值调用方法? 按值调用方法将参数的值复制到该函数的形式参数中。 因此,对 main 函数的参数所做的更改不会影响该参数。 在此参数传递方法中,将实际参数的值复制到函数的形式参数,并将参数存储在不同的存储位置。 因此,在函数内部进行的任何更改都不会反映在调用者的实际参数中。 ## 关键区别 * 在“按值调用”方法中,原始值未修改,而在“按引用调用”方法中,原始值被修改。 * 在按值调用中,传递变量的副本,而在按引用调用中,传递变量本身。 * 在“按值调用”中,将在不同的存储位置中创建实际和形式参数,而在“按引用调用”中,将在相同的存储位置中创建实际和形式参数。 * 按值调用是 C ++,PHP,Visual Basic NET 和 C#等编程语言中的默认方法,而按引用调用仅受 Java 语言支持。 * 按值调用,使用直接方法传递变量,而按引用调用,则需要指针来存储变量的地址。 ## 什么是按引用调用方法? 通过引用调用方法将参数的地址复制到形式参数中。 在此方法中,地址用于访问函数调用中使用的实际参数。 这意味着对参数所做的更改会更改传递的参数。 在这种方法中,内存分配与实际参数相同。 函数中的所有操作都对存储在实际参数地址上的值执行,修改后的值将存储在同一地址。 ## 按值调用方法的示例 ``` void main() { int a = 10, void increment(int); Cout << "before function calling" << a; increment(a); Cout << "after function calling" << a; getch(); void increment(int x) { int x = x + 1; Cout << "value is" << x; } ``` **输出**: ``` before function calling 10 value is 11 after function calling 1-0 ``` 因为在 main()中声明为'a'的变量与在 increment()中声明为'x'的变量不同。 在此程序中,只有变量名相似,但是它们的内存地址不同,并且存储在不同的内存位置。 ## 通过参考呼叫的示例 ``` Public static void(string args[]) { int a = 10; System.out.println("Before call Value of a = ", a); Void increment(); System.out.println("After call Value of a = ", a); } Void increment(int x) { int x = x + 1; } ``` **Output:** ``` Before call Value of a =10 After call Value of a =11 ``` 因为在中声明为'a'的变量引用/指向 main()中的变量'a'。 此处的变量名称不同,但是两者都指向/引用相同的内存地址位置。 ## 按值调用与按引用调用 ![](https://img.kancloud.cn/bf/2c/bf2cb86a89f96f8df191a19cd7b266e3_601x168.png) | **参数** | **通过值调用** | **通过引用致电** | | --- | --- | --- | | 定义 | 调用函数时,通过复制变量传递值时,称为“按值调用”。 | 在调用函数时,使用编程语言而不是复制变量的值,而是使用变量的地址,称为“按引用调用”。 | | 争论 | 在此方法中,传递变量的副本。 | 在这种方法中,变量本身被传递。 | | 影响 | 在变量副本中进行的更改永远不会在函数外部修改变量的值。 | 变量的更改也会影响函数外部变量的值。 | | 价值变更 | 不允许您对实际变量进行任何更改。 | 允许您通过使用函数调用来更改变量的值。 | | 传递变量 | 变量的值使用简单的方法传递。 | 需要指针变量来存储变量的地址。 | | 价值修改 | 原始值未修改。 | 原始值被修改。 | | 记忆体位置 | 实际参数和形式参数将在不同的存储位置中创建 | 实际参数和形式参数将在相同的存储位置中创建 | | 安全 | 实际参数仍然安全,因为它们不会被意外修改。 | 实际的论点并不安全。 它们可能会被意外修改,因此您需要谨慎处理参数操作。 | | 默认 | 许多编程语言(例如 C ++。PHP)中的默认设置。 Visual Basic NET 和 C#。 | 大多数编程语言(例如 JAVA)都支持它,但默认情况下不支持。 | ## 使用按值调用方法的优点 值方法通话的优点/好处: * 该方法不会更改原始变量,因此会保留数据。 * 每当调用函数时,都不要影响实际参数的实际内容。 * 实际参数的值传递给形式参数,因此形式参数的任何更改都不会影响实际情况。 ## 使用按引用方式致电的优势 通过引用方法调用的优点: * 该函数可以更改参数的值,这非常有用。 * 它不会创建仅包含一个值的重复数据,这可以帮助您节省内存空间。 * 在这种方法中,没有参数的副本。 因此,它的处理速度非常快。 * 帮助您避免错误更改 * 读取代码的人从不知道可以在函数中修改该值。 ## 使用按值调用方法的缺点 这是按值调用的主要缺点/缺点: * 更改实际参数还可以修改相应的参数变量 * 在此方法中,参数必须是变量。 * 您不能直接在函数体中更改变量。 * 有时参数可以是复杂的表达式 * 为同一变量创建了两个副本,这些副本的存储效率不高。 ## 使用按引用方法调用的缺点 这是使用按引用调用方法的主要缺点: * 强有力的非零保证。 接受引用的函数需要确保输入为非空。 因此,不需要进行空检查。 * 通过引用使功能在理论上不纯。 * 终身保证是参考的大问题。 当使用 lambda 和多线程程序时,这特别危险。