重新访问呼叫与引用呼叫



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

最终我的问题归结为此。为什么Java按值调用,而C 通过参考调用(使用指针时)?

通过指针传递引用和C 中的Java中的方法调用。最后,在这两种情况下,我都可以进行呼叫者可见的更改。同样在这两种情况下,我都将对象的地址传递给函数。实际上,我正在复制,即在传递指针时也会在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;
}

将打印两倍的地址。

对我来说,这还不足以通过引用与属性进行呼叫合理,您可以使用它进行交换函数。我想知道通过引用引用的呼叫的核心。

预先感谢您。

最终我的问题归结为此。为什么Java按值调用,而C 通过参考调用(使用指针时)?

c 确实是逐个通话,而不是逐个电话。您在C 中看到的补充行为是您传递指针的事实的副作用:指针本身按价值复制。您无法比较这些情况,因为Java没有指针。

您给出的示例是不适当使用引用。在功能中modify

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

您声明堆栈上的局部变量a。当它不在范围内时,其地址毫无意义。因此,将a的地址分配给ii点没有影响。

因此,通过参考工作调用的是您可以修改 i点在功能中的值。例如:

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

因此,在主要函数中,您可以将其称为:

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

相关内容

  • 没有找到相关文章

最新更新