Sha*_*uri 4 c c++ java pass-by-reference call-by-value
我知道 C 和 C++ 中按引用传递的整个概念,以及 Java 中仅按值传递的类似概念。但从某种角度来看,一切都是按价值传递的,不是吗?在 C 中,我们将变量的指针传递给函数。所以我们只是将 的引用值传递给函数。这就是我们说 Java 不支持引用传递的原因,因为我们只是将引用变量的值传递给函数。所以我们按值传递引用。尽管在 C++ 中,有一种通过引用传递的方法,因为我们可以传递参数,并且该函数将使用这种格式使用相同的内存位置
void swap(int &x, int &y)
Run Code Online (Sandbox Code Playgroud)
但在 C 中通过指针按引用传递只是按值传递指针。
void swap(int* x, int* y)
Run Code Online (Sandbox Code Playgroud)
我知道这个问题可能看起来有点愚蠢,但我觉得我的整个概念有一个很大的漏洞。那么按引用调用的实际定义是什么,这只是另一个上下文中按值调用的伪名称吗?
通过引用传递意味着被调用函数的参数将与调用者传递的参数相同(不是值,而是标识 - 变量本身)。按值传递意味着被调用函数的参数将是调用者传递的参数的副本。值是相同的,但身份(变量)不同。因此,在一种情况下,对被调用函数完成的参数的更改会更改传递的参数,而在另一种情况下,只会更改被调用函数中参数的值(这只是一个副本)。
C++ 中的简单示例
#include <iostream>
void by_val(int arg) { arg += 2; }
void by_ref(int&arg) { arg += 2; }
int main()
{
int x = 0;
by_val(x); std::cout << x << std::endl; // prints 0
by_ref(x); std::cout << x << std::endl; // prints 2
int y = 0;
by_ref(y); std::cout << y << std::endl; // prints 2
by_val(y); std::cout << y << std::endl; // prints 2
}
Run Code Online (Sandbox Code Playgroud)