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

bb2*_*bb2 13 c++

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

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

有什么区别,哪一个更好,还是意味着相同?我知道第二个是指向指针的指针.

谢谢

Mar*_*ers 20

first(**)是指针的指针,second(*&)是指针的引用.

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

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

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

  • 你不能有一个指向引用的指针(这是指针和引用之间的另一个区别,它也在我链接到的页面上提到).另见这个问题:http://stackoverflow.com/questions/1898524/difference-between-pointer-to-a-reference-and-reference-to-a-pointer (3认同)

Joh*_*ing 5

附:

addNode( node *&head, int value)
Run Code Online (Sandbox Code Playgroud)

...类型head是"指向节点的指针".

附:

addNode(node **head, int value)
Run Code Online (Sandbox Code Playgroud)

...类型是"指向节点的指针".

指针和引用不是一回事.考虑引用的简单方法是作为解引用指针.

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

node* my_node = 0;
addNode(my_node, 0);  // syntax for first version
addNode(&my_node, 0); // syntax for 2nd version
Run Code Online (Sandbox Code Playgroud)

也存在语义差异.传递指针时,可以传递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";
}
Run Code Online (Sandbox Code Playgroud)

这两个完成相同的事情,但一个接受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
Run Code Online (Sandbox Code Playgroud)

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


Bil*_*nch 1

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