我想知道如何使一个函数改变两个变量(返回和另一个变量),我偶然发现用'&'调用函数在参数之前(我理解为参数的地址)然后在整个函数中,用'*'符号引用它(我猜这是一个“取消引用”并且意味着它改变地址处的对象)。
无论如何,这一切都很顺利,然后朋友说你可以直接用变量调用函数,用&和变量引用变量。在标题之前,并在整个函数中正常处理它。这似乎更容易,为什么网上没有更多关于它的内容呢?一种风格比另一种更正确吗?
void foo(int &junk) //The way the friend said
{
junk++;
}
void oof(int *junk) //what I found, and what the internet seems full of
{
(*junk)++;
}
int main ()
{
int junk=1;
std::cout << junk << "\n";
foo(junk);
std::cout << junk << "\n";
oof(&junk);
std::cout << junk;
}
输出:
1
2
3
所以一切正常,我猜想。
答案 0 :(得分:2)
第一种方法称为“通过指针”;第二种方法称为“通过引用传递”。在第一种情况下,解除引用是明确的;在第二种情况下,取消引用是隐含的。
这两种方法的最大区别在于,当您通过指针传递时,您可以传递“无”(即空指针)。当您通过引用传递时,不可能合法地将引用传递给任何内容:它应该是对某个变量,数组元素,类或结构的字段等的引用。
当您需要返回值并修改变量时,通过引用传递更合适,因为您需要修改的变量始终存在。当遍历由指针连接的动态数据结构时,当指向该数据结构的某些部分可能存在或不存在时,通过指针传递会更合适。
答案 1 :(得分:2)
你的第一个函数foo
,你通过引用传递:
当一个变量通过引用传递时,我们没有传递它的值的副本,但是我们以某种方式将变量本身传递给函数,并且我们对局部变量所做的任何修改都会对它们传递的对应变量产生影响作为函数调用中的参数。
通过引用传递的示例:
在你的第二个例子oof
中,你传递一个指向变量的指针。
如果你想知道两个例子之间的不同,我建议你阅读:https://stackoverflow.com/a/57492/1394283
但是,何时应该使用references
以及何时应该使用pointer
?
我会尽可能地使用references
,必要时使用pointers
。
原因是指针比其他任何结构都更难以跟踪/阅读,安全性更低,操作更危险。
这篇文章解释得非常好:https://stackoverflow.com/a/7058373/1394283