#include <stdio.h>
void pasoPorValor(int i) {
i = 50;
}
void pasoPorReferencia(int *i) {
(*i) = -10;
}
int main() {
int i = 10;
pasoPorValor(i);
printf("%d\n", i);
//&i significa que se pasa la referencia de la variable i
pasoPorReferencia(&i);
printf("%d\n", i);
return 0;
}
当它是按值时,变量的信息在函数中接收时存储在不同的内存地址中,因此如果该变量的值发生变化,它不会影响原始变量,它只会在函数的上下文中被修改.
当它是通过引用时,函数中作为参数接收的变量指向与原始变量完全相同的内存地址,因此如果在函数内修改其值,则原始变量也会被修改。
正如这个 gif 中所解释的那样。
差异的本质对应于函数或方法的参数上存在的自由(或限制)。
按值传递是指从客户端函数/方法传递参数值的副本。作为副本,直接在函数/方法中对参数值所做的更改将不会在函数/方法执行结束时反映出来。
通过引用传递是指从客户端函数/方法传递相同的参数值。作为相同的值,直接在函数/方法中对参数值所做的更改将在函数/方法执行结束时反映出来。
举个例子,想象一下你手中有一个物理文档。当您第一次制作文档副本并将其交给同事时,您按价值传递此文档。如果合作伙伴不小心弄脏了这份文件,您的原始文件不会受到影响,因为合作伙伴已经处理了一份副本。另一方面,通过引用传递文档意味着您将原始文档交给您的同事,如果他将其烧毁,然后创建一个内容完全不同的新文档并将其返回给您,那么现在他给您的将是文件和原始文件丢失了:( 。
从技术上讲,你可以在 C 中看到这个例子:
打印结果:
重要的是要知道所使用的编程语言是否允许通过值和/或引用传递变量。例如,Java 和 Scala不允许通过引用传递变量。C、C++、C#、Visual Basic 等都允许这两种类型的变量传递。
重要提示:引用传递不应与引用值传递相混淆。后者意味着传递了引用的副本,但是它允许编辑参数引用的引用的状态(原谅冗余)。