按值传递和按引用传递的区别

按值传递与按引用传递的关键区别

  • 在按值传递方法中,原始值不会被修改,而在按引用传递方法中,原始值会被修改。
  • 在按值传递中,传递的是变量的副本,而在按引用传递中,传递的是变量本身。
  • 在按值传递中,实际参数和形式参数将在不同的内存位置创建,而在按引用传递中,实际参数和形式参数将在相同的内存位置创建。
  • 按值传递是 C++、PHP、Visual Basic NET 和 C# 等编程语言中的默认方法,而按引用传递仅在 Java 语言中支持。
  • 按值传递变量是使用直接方法传递的,而按引用传递则需要指针来存储变量的地址。

Difference between Call by Value and Call by Reference

在编程语言中,函数可以通过两种方式调用:一种称为按值传递,另一种称为按引用传递。

什么是按值传递方法?

按值传递方法将参数的值复制到该函数的形参中。因此,对主函数形参所做的更改不会影响实参。

在此参数传递方法中,将实参的值复制到函数的形参,并且参数存储在不同的内存位置。因此,在函数内所做的任何更改都不会反映在调用者的实参中。

什么是按引用传递方法?

按引用传递方法将参数的地址复制到形参。在此方法中,地址用于访问函数调用中使用的实际参数。这意味着对形参的更改会影响传递的参数。

在此方法中,内存分配与实际参数相同。函数中的所有操作都对存储在实际参数地址中的值执行,修改后的值将存储在同一地址。

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 和多线程程序时,这尤其危险。