**和*&之间的C ++差异在参数传递中

时间:2010-09-30 19:21:11

标签: c++

我已经在列表上实现了操作,其中一个是添加,并且由于我不想返回任何内容,我读到我必须使用**,它可以工作,但我在另一个地方看到它作为*&传递,但我不知道差异

addNode(node *& head,int value) addNode(node ** head,int value)

有什么不同,哪一个更好,或者它们的含义是否相同? 我知道第二个是指向指针的指针。

由于

3 个答案:

答案 0 :(得分:15)

第一个(**)是指针的指针,第二个(*&)是指针的引用。 / p>

参考和指针在概念上非常相似。但是有一些重要的区别,例如:

  • 引用不能为NULL(但它可以引用指向NULL的指针)。
  • 您无法修改引用以引用其他内容。
  • 您需要取消引用一个指针来访问该值。

有关更多差异,请参阅此相关问题:

答案 1 :(得分:5)

使用:

addNode( node *&head, int value)

... head的类型是“指向节点的指针”。

使用:

addNode(node **head, int value)

...类型是“指向节点的指针”。

指针和引用相同的东西。一种考虑引用的简单方法是作为解除引用的指针

您需要使用不同的语法来调用这两个版本:

node* my_node = 0;
addNode(my_node, 0);  // syntax for first version
addNode(&my_node, 0); // syntax for 2nd version

也存在语义差异。传递指针时,可以传递NULL。当您传递参考时,您不能。这是一个让ref-to-ptr混淆了这个问题的函数,所以让我们稍微改变一下这个问题:

void make_string(string& str_ref)
{
  str_ref = "my str";
}

void make_string_again(string* str_ptr)
{
  *str_ptr = "my other string";
}

这两个结果做同样的事情,但是一个采用string引用,而另一个采用string指针。如果你这样做:

string str;
make_string(str); // OK
make_string_again(&str); // OK - &str is a pointer to a real string
make_string_again(0); // Not OK - compiles but will crash when function dereferences the null pointer

您可以看到使用空指针调用make_string变得困难(但并非不可能)。这可以帮助您在期望make_string 永远不会使用无效对象调用的情况下实现更好的功能。

答案 2 :(得分:1)

这是pass by valuepass by reference之间的差异。通过引用传递,基本上,隐式地执行双指针获取的引用和解引用。