按值传递和按引用传递的区别
按值传递与按引用传递的关键区别
- 在按值传递方法中,原始值不会被修改,而在按引用传递方法中,原始值会被修改。
- 在按值传递中,传递的是变量的副本,而在按引用传递中,传递的是变量本身。
- 在按值传递中,实际参数和形式参数将在不同的内存位置创建,而在按引用传递中,实际参数和形式参数将在相同的内存位置创建。
- 按值传递是 C++、PHP、Visual Basic NET 和 C# 等编程语言中的默认方法,而按引用传递仅在 Java 语言中支持。
- 按值传递变量是使用直接方法传递的,而按引用传递则需要指针来存储变量的地址。
在编程语言中,函数可以通过两种方式调用:一种称为按值传递,另一种称为按引用传递。
什么是按值传递方法?
按值传递方法将参数的值复制到该函数的形参中。因此,对主函数形参所做的更改不会影响实参。
在此参数传递方法中,将实参的值复制到函数的形参,并且参数存储在不同的内存位置。因此,在函数内所做的任何更改都不会反映在调用者的实参中。
什么是按引用传递方法?
按引用传递方法将参数的地址复制到形参。在此方法中,地址用于访问函数调用中使用的实际参数。这意味着对形参的更改会影响传递的参数。
在此方法中,内存分配与实际参数相同。函数中的所有操作都对存储在实际参数地址中的值执行,修改后的值将存储在同一地址。
C 语言按值传递方法的代码示例
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”不同。在此程序中,只有变量名相似,但它们的内存地址不同,并且存储在不同的内存位置。
Java 语言按引用传递方法的代码示例
Public static void main(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; }
输出
Before call Value of a =10 After call Value of a =11
因为在 main() 中声明的变量“a”引用/指向 main() 中的变量“a”。这里变量名不同,但它们都指向/引用相同的内存地址。
按值传递与按引用传递
参数 | 按值传递 | 按引用传递 |
---|---|---|
定义 | 调用函数时,通过复制变量来传递值,称为“按值传递”。 | 调用函数时,在编程语言中,不复制变量的值,而是使用变量的地址,称为“按引用传递”。 |
参数 | 在此方法中,传递的是变量的副本。 | 在此方法中,传递的是变量本身。 |
影响 | 对变量副本的更改永远不会修改函数外部变量的值。 | 对变量的更改也会影响函数外部变量的值。 |
值更改 | 不允许您更改实际变量。 | 允许您通过函数调用来更改变量的值。 |
变量传递 | 变量值是使用直接方法传递的。 | 需要指针变量来存储变量的地址。 |
值修改 | 原始值未修改。 | 原始值被修改。 |
内存位置 | 实际参数和形式参数 将创建在不同的 内存位置 |
实际参数和形式参数 将创建在相同的 内存位置 |
安全性 | 实际参数保持 安全,因为它们无法被修改 意外。 |
实际参数不 安全。它们可以 意外修改,因此您需要仔细处理参数操作。 |
默认 | 在许多编程语言中是默认的, 如 C++、PHP、Visual Basic NET 和 C#。 |
它被大多数 编程语言(如 JAVA)支持,但 不是默认的。 |
在 C 语言中使用按值传递方法的优点
C 语言中按值传递的优点/好处
- 该方法不更改原始变量,因此可以保留数据。
- 每当调用函数时,它都不会影响实际参数的实际内容。
- 将实际参数的值传递给形式参数,因此对形式参数所做的任何更改都不会影响实际参数。
使用按引用传递方法的优点
使用按引用传递方法的优点
- 函数可以更改参数的值,这非常有用。
- 它不为只存储一个值而创建重复数据,这有助于节省内存空间。
- 在此方法中,没有创建参数的副本。因此,处理速度非常快。
- 有助于避免错误的更改
- 阅读代码的人永远不知道函数中的值可以被修改。
使用按值传递方法的缺点
这里是按值传递方法的主要缺点/不足之处
- 对实际参数的更改也会修改相应的参数变量
- 在此方法中,参数必须是变量。
- 您无法直接更改函数体中的变量。
- 有时参数可以是复杂的表达式
- 为同一个变量创建了两个副本,这不符合内存效率。
使用按引用传递方法的缺点
这里是使用按引用传递方法的主要缺点
- 强大的非空保证。接受引用的函数需要确保输入是非空的。因此,无需进行空检查。
- 按引用传递使函数在理论上不纯。
- 生命周期保证是引用的一个主要问题。当处理 lambda 和多线程程序时,这尤其危险。