6

我想知道如何让一个函数改变两个变量(返回和另一个),我偶然发现在参数(我理解为参数的地址)之前使用“&”调用函数,然后在整个函数中,用“*”符号引用它(我猜这是“取消引用”,意味着它会改变地址处的对象)。

不管怎样,一切都很好,然后一个朋友说你可以直接用变量调用函数,在 header 中用 & 引用变量,并在整个函数中正常对待它。这似乎更容易,那么为什么网络上没有更多关于它的信息呢?一种风格比另一种更正确吗?

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

所以一切正常,我想。

4

2 回答 2

4

你的第一个函数foo,你通过引用传递:

当一个变量通过引用传递时,我们并没有传递其值的副本,而是以某种方式将变量本身传递给函数,并且我们对局部变量所做的任何修改都会对它们作为参数传递的对应变量产生影响对函数的调用。

通过引用传递的示例:

通过引用传递

在您的第二个示例oof中,您正在传递一个指向变量的指针。

如果您想知道这两个示例之间的区别,我建议您阅读以下内容:https ://stackoverflow.com/a/57492/1394283

但是,什么时候应该使用references,什么时候应该使用pointer

我会说尽可能使用references,随时使用pointers

原因是与任何其他构造相比,指针使事情更难理解/阅读,更不安全且更危险的操作。

这篇文章很好地解释了它:https ://stackoverflow.com/a/7058373/1394283

于 2013-07-27T16:42:27.977 回答
3

第一种方法称为“指针传递”;第二种方法称为“通过引用”。在第一种情况下,取消引用是明确的;在第二种情况下,取消引用是隐式的。

这两种方式最大的区别在于,当你通过指针传递时,你可以传递“无”(即空指针)。当您通过引用传递时,不可能合法地将引用传递给任何对象:它应该是对某个变量、数组元素、类或结构的字段等的引用。

当需要返回值和修改变量时,通过引用传递更为合适,因为需要修改的变量始终存在。当您遍历由指针连接的动态数据结构时,当该数据结构的某些部分可能存在也可能不存在时,通过指针传递变得更合适。

于 2013-07-27T16:35:11.753 回答