我想知道如何让一个函数改变两个变量(返回值和另一个变量),我偶然发现在参数(我理解是指参数的地址)之前使用“&”调用该函数,然后在整个函数中,用“*”符号引用它(我猜这是“取消引用”,意味着它改变了地址处的对象)。
总之,一切都很顺利,然后一个朋友说你可以直接用变量调用函数,在标题中用 & 引用变量,并在整个函数中正常对待它。这看起来更容易,那么为什么网上没有更多关于它的信息呢?一种风格比另一种更正确吗?
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
所以我认为一切正常。
第一种方法称为“按引用传递”;第二种方法称为“通过指针传递”。在第一种情况下,取消引用是隐式的(没有星号);在第二种情况下,取消引用是显式的。
两种方法之间最大的区别在于,当您传递指针时,您可以传递“无”(即空指针)。当您通过引用传递时,不可能合法地传递对任何内容的引用:它应该是对某个变量、数组元素、类或结构的字段等的引用。
当需要返回值并修改变量时,通过引用传递更合适,因为需要修改的变量总是存在的。当您遍历由指针连接的动态数据结构时,当该数据结构的某些部分可能存在或可能不存在时,通过指针传递变得更合适。
您的第一个函数
foo
,您正在通过引用传递:
当变量通过引用传递时,我们不会传递其值的副本,而是以某种方式将变量本身传递给函数,并且我们对局部变量所做的任何修改都会对作为参数传递的对应变量产生影响在函数调用中。
通过引用传递的示例:
在第二个示例中
oof
,您正在传递一个指向变量的指针。
如果您想了解这两个示例之间的区别,我建议您阅读以下内容:https://stackoverflow.com/a/57492/1394283
但是,什么时候应该使用
references
,什么时候应该使用pointer
?
我会说只要有可能就使用
references
,只要有必要就使用 pointers
。
原因是,与任何其他构造相比,指针使事情更难以遵循/阅读,安全性更低,而且危险得多。