加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么程序员说“按引用传递”实际上是“按值传递引用?

发布时间:2020-12-15 04:44:54 所属栏目:Java 来源:网络整理
导读:我知道在C amp;中通过引用传递的整个概念. C,和类似的概念只在 Java中传递值. 但从一个角度看,一切都是通过价值不是吗? 在C中,我们将变量的指针传递给函数.所以我们只是将参考值传递给函数.这就是我们说Java不支持通过引用传递的原因,因为我们只是将引用变
我知道在C& amp;中通过引用传递的整个概念. C,和类似的概念只在 Java中传递值.
但从一个角度看,一切都是通过价值不是吗?
在C中,我们将变量的指针传递给函数.所以我们只是将参考值传递给函数.这就是我们说Java不支持通过引用传递的原因,因为我们只是将引用变量的值传递给函数.所以我们按值传递引用.虽然在C中有一种通过引用传递的方式,因为我们可以传递参数,并且该函数将使用此格式使用相同的内存位置

void swap(int &x,int &y)

但是通过C中的指针引用传递只是按值传递指针.

void swap(int* x,int* y)

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

解决方法

两个要点:

> C中没有参考号召.
>按值传递并通过引用传递是不同的.它们不一样.

按值传递:被调用函数在堆栈中创建一组新变量,并将参数值复制到其中.

通过引用传递:不是将值传递给被调用的函数,而是传递对原始变量的引用/指针.

Why do programmers say that “pass by reference” is really “passing references by value?”

在传递对原始变量的引用/指针时,事实上对象/地址是按值传递的.因此,您可以说通过引用传递是按值传递引用,但这并不意味着通过引用传递是传递值的伪名称.两者之间的区别在this answer中得到了很好的解释.我正在复制摘录:

If I tell you the URL,I’m passing by reference. You can use that URL to see the same web page I can see. If that page is changed,we both see the changes. If you delete the URL,all you’re doing is destroying your reference to that page – you’re not deleting the actual page itself.

If I print out the page and give you the printout,I’m passing by value. Your page is a disconnected copy of the original. You won’t see any subsequent changes,and any changes that you make (e.g. scribbling on your printout) will not show up on the original page. If you destroy the printout,you have actually destroyed your copy of the object – but the original web page remains intact.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读