I have implemented operations on a list, one of them is add, and since i don't want to return anything, i read that i had to use **, and it works, but i saw on another place that it is passed as *&, but i don't know the difference
addNode( node *&head, int value) addNode(node **head, int value)
What is the difference, and which one is better, or do they mean the same? I know the second is pointer to a pointer.
Thanks
With the * operator, I make a new variable, which is allocated a place in memory. So as to not unnecessarily duplicate variables and their values, the & operator is used in passing values to methods and such and it actually points to the original instance of the variable, as opposed to making new copies...
Difference between ++*p, *p++ and *++p in C++ is increment operator used in prefix and postfix expressions. * is dereference operator. Precedence of prefix ++ and * is same and both are right to left associative. Precedence of postfix ++ is higher than both prefix ++ and * and is left to right associative.
C++ provides two-pointer operators, which are Address of Operator (&) and Indirection Operator (*). A pointer is a variable that contains the address of another variable or you can say that a variable that contains the address of another variable is said to "point to" the other variable.
The first (**
) is a pointer to a pointer and the second (*&
) is a reference to a pointer.
A reference and a pointer are conceptually quite similar. But there are some important differences, for example:
See this related question for more differences:
With:
addNode( node *&head, int value)
...the type of head
is "reference to pointer-to-node".
With:
addNode(node **head, int value)
... the type is "pointer-to-pointer-to-node".
A pointer and a reference are not the same thing. A simple way to think of a reference is as a dereferenced pointer.
You would need different syntax to call both versions:
node* my_node = 0;
addNode(my_node, 0); // syntax for first version
addNode(&my_node, 0); // syntax for 2nd version
There are semantic differences as well. When you pass a pointer, you can pass NULL. When you pass a reference, you can't. This being a function that takes a ref-to-ptr confuses the matter a little, so let's change the problem a bit:
void make_string(string& str_ref)
{
str_ref = "my str";
}
void make_string_again(string* str_ptr)
{
*str_ptr = "my other string";
}
These two finctions do the same thing but one takes a string
reference while the other takes a string
pointer. If you were to do this:
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
You can see it becomes difficult (but not impossible) to call make_string
with a null pointer. This could help you to implement better functions in the case where you expect that make_string
will never be called with an invalid object.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With