我已经在列表上实现了操作,其中一个是添加,并且由于我不想返回任何内容,我读到我必须使用**,它可以工作,但我在另一个地方看到它作为*&传递,但我不知道差异
addNode(node *& head,int value) addNode(node ** head,int value)
有什么不同,哪一个更好,或者它们的含义是否相同? 我知道第二个是指向指针的指针。
由于
答案 0 :(得分:15)
第一个(**
)是指针的指针,第二个(*&
)是指针的引用。 / p>
参考和指针在概念上非常相似。但是有一些重要的区别,例如:
有关更多差异,请参阅此相关问题:
答案 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 value和pass by reference之间的差异。通过引用传递,基本上,隐式地执行双指针获取的引用和解引用。