让我首先说。我知道标题怀疑我在问一个问题,在这里和互联网上回答了很多次。我确实进行了研究,但我只是找不到令人满意的答案。
最终我的问题归结为此。为什么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
的地址分配给i
对i
点没有影响。
因此,通过参考工作调用的是您可以修改 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