gpt4 book ai didi

java - 为什么程序员说 "pass by reference"真的是 "passing references by value?"为什么这很重要?

转载 作者:太空狗 更新时间:2023-10-29 19:48:18 25 4
gpt4 key购买 nike

我知道 C 和 C++ 中通过引用传递的整个概念,以及 Java 中仅通过值传递的类似概念。但是从某种角度来看,一切都是按值(value)传递的,不是吗?在 C 中,我们将变量的指针传递给函数。所以我们只是将引用的值传递给函数。这就是我们说 Java 不支持引用传递的原因,因为我们只是将引用变量的值传递给函数。所以我们按值传递引用。虽然在 C++ 中有一种通过引用传递的方法,因为我们可以传递参数,并且函数将使用这种格式在相同的内存位置工作

void swap(int &x, int &y)

但是在 C 中通过指针的引用传递只是通过值传递指针。

void swap(int* x, int* y)

我知道这个问题可能看起来有点愚蠢,但我觉得我的整个概念中存在一个很大的漏洞。那么按引用调用的实际定义是什么,这只是另一个上下文中按值调用的伪名称吗?

最佳答案

通过引用传递意味着被调用函数的参数将与调用者传递的参数相同(不是值,而是标识 - 变量本身)。按值传递意味着被调用函数的参数将是调用者传递的参数的拷贝。值将相同,但标识(变量)不同。因此,在一种情况下,被调用函数对参数所做的更改会更改传递的参数,而在另一种情况下,只会更改被调用函数中参数的值(这只是一个拷贝)。

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
}

关于java - 为什么程序员说 "pass by reference"真的是 "passing references by value?"为什么这很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27879068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com