2010-09-30 4 views
8

Я реализовал операции над списком, один из них добавлен, и поскольку я не хочу ничего возвращать, я прочитал, что мне пришлось использовать **, и она работает, но я видел на другом месте, что она передается как * &, но я не знаю разницуРазница между C++ и ** и параметром

AddNode (узел * & головки, внутр значение) AddNode (узел ** голова, внутр значение)

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

Благодаря

ответ

1

Это разница между pass by value и pass by reference. Передача по ссылке, в основном, неявно делает ссылку и разыменовывает вас двойной указатель.

13

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

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

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

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

+0

По крайней мере, согласно найденной статье, это указатель на ссылку, а не наоборот. (Я не был уверен, какой из них он сам, поэтому я действительно не знаю точно). Разница может быть очень тонкой, но в редких случаях это может вызвать некоторую путаницу. –

+2

У вас нет указателя на ссылку (это еще одно различие между указателями и ссылками, и это также упоминается на странице, с которой я связан). См. Также этот вопрос: http://stackoverflow.com/questions/1898524/difference-between-pointer-to-a-reference-and-reference-to-a-pointer –

+0

Хорошая точка. Я не думал об этом достаточно близко. Я просто пытался подумать об этом с точки зрения привязки оператора. –

4

С:

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. Когда вы передаете ссылку, вы не сможете.Поскольку это функция, которая принимает реф-к-PTR путает этот вопрос немного, так что давайте изменим проблему немного:

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

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

Этих два finctions сделать то же самое, но один принимает string ссылки, а другие принимают a 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 будет никогда не будет с недопустимым объектом.

Смежные вопросы