按值调用和按引用调用之间的区别
按值调用和按引用调用之间的主要区别
- 在按值调用方法中,原始值不会被修改,而在按引用调用方法中,原始值会被修改。
- 在按值调用中,传递的是变量的副本,而在按引用调用中,传递的是变量本身。
- 在按值调用中,实际参数和形式参数将在不同的内存位置创建,而在按引用调用中,实际参数和形式参数将在相同的内存位置创建。
- 按值调用是编程语言中的默认方法,例如 C++、PHP、Visual Basic NET 和 C#,而引用调用仅支持 Java 语言。
- 通过值调用变量使用一种简单的方法传递,而通过引用调用指针需要存储变量的地址。
在编程语言中,可以通过两种方式调用函数:称为按值调用和按引用调用。
什么是按值调用方法?
按值调用方法将参数的值复制到该函数的形式参数中。 因此,对 main 函数的参数所做的更改不会影响参数。
在这种参数传递方法中,实际参数的值被复制到函数的形式参数中,并将参数存储在不同的内存位置。 因此,在函数内部所做的任何更改都不会反映在调用者的实际参数中。
什么是引用调用方法?
通过引用调用方法将参数的地址复制到形式参数中。 在此方法中,地址用于访问函数调用中使用的实际参数。 这意味着在参数中所做的更改会改变传递的参数。
在该方法中,内存分配与实际参数相同。 函数中的所有操作都是对实参地址存储的值进行的,修改后的值也会存储在同一个地址。
按值调用方法的 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”的变量正在引用/指向变量“a”。 这里的变量名不同,但都指向/引用相同的内存地址位置。
按值调用与按引用调用
参数 | 按价值致电 | 通过参考电话 |
---|---|---|
定义 | 在调用函数时,当您通过复制变量传递值时,它被称为“按值调用”。 | 在调用函数时,在编程语言中不是复制变量的值,而是使用变量的地址,这被称为“按引用调用”。 |
参数 | 在此方法中,传递了变量的副本。 | 在这个方法中,传递了一个变量本身。 |
影响 | 在变量副本中所做的更改永远不会修改函数外部变量的值。 | 变量的变化也会影响函数外变量的值。 |
价值的改变 | 不允许您对实际变量进行任何更改。 | 允许您使用函数调用来更改变量的值。 |
传递变量 | 变量的值使用一种直接的方法传递。 | 需要指针变量来存储变量的地址。 |
值修改 | 原始值未修改。 | 原始值被修改。 |
记忆体位置 | 实际和形式论据 将以不同的方式创建 记忆位置 |
实际和形式论据 将在同一个 记忆位置 |
安全 | 实际争论仍然存在 安全,因为无法修改 偶然。 |
实际参数不是 安全。它们可以 意外修改,因此需要小心处理参数操作。 |
默认 | 许多编程中的默认设置 像这样的语言 C++.PHP、Visual Basic NET 和 C#。 |
大多数人支持 像 JAVA 这样的编程语言,但是 不是默认的。 |
在 C 中使用按值调用方法的优点
C 语言中按值调用的优点/好处:
- 该方法不会更改原始变量,因此它保留了数据。
- 每当一个函数被调用时,永远不会影响实际参数的实际内容。
- 实际参数的值传递给正式参数,因此对正式参数所做的任何更改都不会影响实际案例。
使用按引用调用方法的优点
使用引用调用方法的优点:
- 该函数可以更改参数的值,这非常有用。
- 它不会为仅保存一个值而创建重复数据,这有助于您节省内存空间。
- 在此方法中,没有创建参数的副本。 因此处理速度非常快。
- 帮助您避免错误地进行更改
- 阅读代码的人永远不知道可以在函数中修改该值。
使用按值调用方法的缺点
以下是按值调用方法的主要缺点:
- 对实际参数的更改也可以修改相应的参数变量
- 在此方法中,参数必须是变量。
- 您不能直接更改函数体中的变量。
- 有时参数可以是复杂的表达式
- 为同一个变量创建了两个副本,内存效率不高。
使用按引用调用方法的缺点
这里是使用引用调用方法的主要缺点:
- 强非空保证。 接受引用的函数需要确保输入是非空的。 因此,不需要进行空检查。
- 通过引用传递使函数在理论上不纯粹。
- 终身保证是参考文献的一个大问题。 这在使用 lambda 和多线程程序时特别危险。