2010-09-30 11 views
8

Mam zaimplementowane operacje na liście, jedna z nich jest dodana, a ponieważ nie chcę niczego zwracać, przeczytałem, że musiałem użyć **, i to działa, ale widziałem na innym miejscu, że jest przekazywany jako * &, ale ja nie znam różnicęC++ różnica między ** i * w przekazywaniu parametrów

addNode (węzeł * & głowy, wartość int) addNode (węzeł ** głowa, int value)

Jaka jest różnica i która z nich jest lepsza, czy też mają na myśli to samo? Wiem, że drugi jest wskaźnikiem do wskaźnika.

Dzięki

Odpowiedz

1

Jest to różnica między pass by value i pass by reference. Przekaż jako odniesienie, w zasadzie, niejawnie robi odniesienie i dereferencji, które dostaje podwójny wskaźnik.

13

pierwszy (**) jest wskaźnik do wskaźnika i drugi (*&) jest odniesienia do wskaźnika.

Odwołanie i wskaźnik są koncepcyjnie dość podobne. Istnieją jednak pewne istotne różnice, na przykład:

  • Odwołanie nie może mieć wartości NULL (ale może odnosić się do wskaźnika wskazującego wartość NULL).
  • Nie można modyfikować odniesienia, aby odwoływać się do czegoś innego.
  • Musisz wyłuskać wskaźnik, aby uzyskać dostęp do wartości.

Zobacz ten powiązane pytanie dla bardziej różnicami:

+0

Przynajmniej według artykułu, który znalazłem, jest wskaźnikiem odniesienia, a nie odwrotnie. (Nie byłem pewien, który z nich był mną, więc naprawdę nie wiem na pewno.) Różnica może być bardzo subtelna, ale w rzadkich przypadkach może powodować pewne zamieszanie. –

+2

Nie można mieć wskaźnika do odniesienia (to jest kolejna różnica między wskaźnikami i odniesieniami nawiasem mówiąc, a jest to również wspomniane na stronie, z którą się łączyłem). Zobacz także to pytanie: http://stackoverflow.com/questions/1898524/difference-between-pointer-to-a-reference-and-reference-to-a-pointer –

+0

Dobra uwaga. Nie myślałem o tym wystarczająco dokładnie. Próbowałem myśleć o tym w kategoriach związania operatora. –

4

Z:

addNode(node *&head, int value) 

... rodzaj head jest „odniesienie do wskaźnika do -węzeł".

Z:

addNode(node **head, int value) 

... typ jest "wskaźnik do wskaźnika do węzła".

Wskaźnik i odniesienie to , a nie to samo. Prostym sposobem na odniesienie się jest wskaźnik o wartości .

Będziesz potrzebować innej składni zadzwonić obie wersje:

node* my_node = 0; 
addNode(my_node, 0); // syntax for first version 
addNode(&my_node, 0); // syntax for 2nd version 

Istnieją różnice semantyczne, jak również. Po przekazaniu wskaźnika można przekazać wartość NULL. Kiedy przekazujesz referencję, nie możesz.To jest funkcja, która bierze Ref-to-ptr myli sprawa trochę, więc zmieńmy problemu trochę:

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

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

Te dwa finctions zrobić to samo, ale jeden zajmuje string odniesienie natomiast drugi zajmuje wskaźnik string. Jeśli było to zrobić:

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 

Widać staje się trudne (ale nie niemożliwe), aby wywołać make_string z zerowym wskaźnikiem. Może to pomóc w implementacji lepszych funkcji w przypadku, gdy oczekuje się, że zostanie wywołany z nieprawidłowym obiektem.

Powiązane problemy