0

我先说。我知道标题怀疑我在问一个在这里和互联网上多次回答的问题。我确实进行了研究,但我只是找不到令人满意的答案。

我的问题最终归结为这个。为什么 Java 按值调用和 C++ 按引用调用(使用指针时)?

在传递引用时考虑在 Java 中调用方法,在传递指针时考虑在 c++ 中调用。最后,在这两种情况下,我都可以进行调用者可见的更改。同样在这两种情况下,我都将对象的地址传递给函数。实际上,当传递指针时,我也在复制,即在 c++ 中按值进行调用,不是吗?

您可以通过运行以下代码来简单地验证这种情况:

#include <iostream>

void modify (int *i) {
    int a = 5;
    i = &a;
}

int main () {
    int b;
    int *i = &b;
    std::cout << i << std::endl;
    modify(i);
    std::cout << i << std::endl;
    return 0;
}

这将打印两次相同的地址。

对我来说,仅仅通过引用来证明调用的合理性是不够的,你可以使用它来执行交换功能。我想知道按引用调用的核心是什么。

先感谢您。

4

2 回答 2

1

我的问题最终归结为这个。为什么 Java 按值调用和 C++ 按引用调用(使用指针时)?

C++ 实际上是按值调用,而不是按引用调用。您在 C++ 中看到的按引用行为是您传递指针这一事实的副作用:指针本身是按值复制的。您无法比较这些情况,因为 Java 没有指针。

于 2014-01-20T18:53:54.890 回答
0

您给出的示例是不恰当地使用引用调用。在函数中modify

void modify (int *i) {
    int a = 5;
    i = &a;
}

a您声明一个在堆栈上的局部变量。当它超出范围时,它的地址就没有意义了。因此,分配 to 的地址对a指向i的内容没有影响i

因此,使引用调用起作用的是您可以修改函数中i指向的值。例如:

void modify (int *i) {
    int a = 5;
    *i = a;
}

因此,在 main 函数中,您可以这样调用它:

int b = 2;
int *i = &b;
std::cout << *i << std::endl;  //This will print 2
modify(i);
std::cout << *i << std::endl;  //This will prints 5
于 2014-01-20T18:57:23.647 回答