C ++ разница между ** и * & в передаче параметров

Я реализовал операции со списком, одна из них - add, и, поскольку я не хочу ничего возвращать, я прочитал, что мне пришлось использовать **, и это работает, но я увидел в другом месте, что оно передается как * &, но я не знаю разницы

addNode (узел * и заголовок, значение int) addNode (узел ** заголовок, значение int)

В чем разница, и какая из них лучше, или они имеют в виду одно и то же? Я знаю, что второй указатель на указатель.

Спасибо

Ответы на вопрос(3)

С:

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 будутникогда вызываться с недопустимым объектом.

**) этоуказатель на указатель и второй (*&) этоссылка на указатель.

Ссылка и указатель концептуально очень похожи. Но есть несколько важных отличий, например:

Ссылка не может быть NULL (но она может ссылаться на указатель, который указывает на NULL).Вы не можете изменить ссылку, чтобы ссылаться на что-то еще.Вам нужно разыменовать указатель для доступа к значению.

Смотрите этот связанный вопрос для большего различия:

Разница между переменной-указателем и ссылочной переменной в C ++
 Tim Yates30 сент. 2010 г., 21:34
По крайней мере, согласно статье, которую я нашел, это указатель на ссылку, а не наоборот. (Я не был уверен, какой это был я сам, поэтому я точно не знаю.) Разница может быть очень тонкой, но в редких случаях это может вызвать некоторую путаницу.
 Tim Yates30 сент. 2010 г., 21:42
Хорошая точка зрения. Я не думал об этом достаточно близко. Я просто пытался думать об этом с точки зрения привязки операторов.
 Mark Byers30 сент. 2010 г., 21:38
У вас не может быть указателя на ссылку (кстати, это еще одно различие между указателями и ссылками, и это также упоминается на странице, на которую я ссылался). Смотрите также этот вопрос:stackoverflow.com/questions/1898524/...

передать по значению а такжепередать по ссылке, Передача по ссылке, в основном, неявно делает ссылку и разыменование, которое получает двойной указатель.

Ваш ответ на вопрос