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

C++ C++;**和*之间的差异&;在参数传递中,c++,C++,我已经在一个列表上实现了操作,其中一个是add,因为我不想返回任何东西,我读到我必须使用**,它可以工作,但我在另一个地方看到它被传递为*&,但我不知道区别 addNode(节点*&头,int值) addNode(节点**头,int值) 区别是什么,哪一个更好,或者它们的意思相同? 我知道第二个是指向指针的指针 谢谢这就是和之间的区别。通过引用传递,基本上隐式地执行双指针获得的引用和取消引用。第一个(***)是指向指针的指针,第二个(*&)是指向指针的引用 引用和指针在概念上非常相似。但也有一些

我已经在一个列表上实现了操作,其中一个是add,因为我不想返回任何东西,我读到我必须使用**,它可以工作,但我在另一个地方看到它被传递为*&,但我不知道区别

addNode(节点*&头,int值) addNode(节点**头,int值)

区别是什么,哪一个更好,或者它们的意思相同? 我知道第二个是指向指针的指针


谢谢

这就是和之间的区别。通过引用传递,基本上隐式地执行双指针获得的引用和取消引用。

第一个(
***
)是指向指针的指针,第二个(
*&
)是指向指针的引用

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

  • 引用不能为NULL(但它可以引用指向NULL的指针)
  • 不能修改引用以引用其他内容
  • 您需要取消引用指针以访问该值
有关更多差异,请参见此相关问题:

带有:

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。当你传递推荐信时,你不能。这是一个引用ptr的函数,这让问题有点混乱,所以让我们稍微改变一下问题:

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

void make_string_again(string* str_ptr)
{
  *str_ptr = "my other string";
}
这两个finction执行相同的操作,但一个接受
字符串
引用,而另一个接受
字符串
指针。如果要这样做:

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\u 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