java - 在 Java 中按引用传递和在 C 中传递指针有什么区别?

标签 java c pointers pass-by-reference

我已经学习了几个月的Java,现在开始学习C。

我有点困惑,我的印象是通过引用传递一个对象和传递一个指向该对象的指针是一回事:我认为不同之处在于在 Java 中所有对象的传递都是自动通过指针完成的,在 C 语言中,实际上必须在这里和那里撒上小的星号和符号。最近,在谈话中,我确信有区别!

按引用传递和传递指针有什么区别?

最佳答案

Java C 都没有传递引用。它们都是严格按值传递的。

按引用传递语义意味着当您更改方法中参数的值时,调用者将在参数中看到该更改。

现在,您可能会想:“但在 Java 中就是这种情况!如果我在方法期间更改对象,调用者会看到该更改。” 对象不是参数。参数只是变量 - 如果您更改该变量的值,调用者将看不到它。例如:

public void foo(Object x)
{
    x = null;
}

public void caller()
{
    Object y = new Object();
    foo(y);
    // y is still not null!
}

如果参数真的通过引用传递,y 之后将为空。相反,y 的值只是一个引用,该引用是按值传递的。这很令人困惑,因为“引用”一词在两个术语中都有,但它们是不同的东西。

你可能想看看my article about C# parameter passing看看如果 Java 确实 具有传递引用语义,就像 C# 在(且仅当)您使用 ref 关键字时所做的那样。

您可能还想查看对 my Stack Overflow answer 的评论与主题相关。

关于java - 在 Java 中按引用传递和在 C 中传递指针有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/600651/

相关文章:

java - 安卓 KXmlParser "NoSuchMethodError: java.lang.System.arraycopy([CI[CII)V"

java - 在始终打开的 Eclipse 上执行 SilkTest 操作?

c - 关于 malloc() 的奇怪行为

c - 为什么我们向 scanf 提供地址?

c++ - 声明 C++ 时指针的值

java - 如何创建范围内的元素数组?

java - 用户可以使用哪个属性将 JTree 的节点设置为复选框?

c++ - 如何使用着色器在 opengl es 中渲染四边形内的部分纹理

objective-c - 除以小于 1 的 float 时无穷大?

c++ - 将 argv 与函数一起使用时出错