按值调用和按引用调用之间的区别

按值调用和按引用调用之间的主要区别

  • 在按值调用方法中,原始值不会被修改,而在按引用调用方法中,原始值会被修改。
  • 在按值调用中,传递的是变量的副本,而在按引用调用中,传递的是变量本身。
  • 在按值调用中,实际参数和形式参数将在不同的内存位置创建,而在按引用调用中,实际参数和形式参数将在相同的内存位置创建。
  • 按值调用是编程语言中的默认方法,例如 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 和多线程程序时特别危险。