У меня очень простой Связанный список. Моя addNode(Node* &list, int value)
добавляет новый узел в свой Связанный список, если я передаю свой список по ссылке. Если я addNode(Node* list, int value)
свой список по значению, это не так: addNode(Node* list, int value)
.
Я знаю, что pass by value
и pass by reference
, но я думал, что параметр функции указателя по сути передается по ссылке, потому что указатель указывает на ячейку памяти (является ссылкой на экземпляр). Поэтому я думал, что &
является избыточным, не так ли? Или я ошибаюсь?
class Node
{
public:
Node* next;
Node* prev;
int value;
Node(int nValue=0) : next(NULL), prev(NULL), value(nValue) { }
~Node() { cout << "Deleting " << value << endl; }
};
// Why do I need to pass by reference 'list'?
// If I dont then the variable 'linkedList' (in main) doesn't have nodes added to it
void addNode(Node* &list, int value)
{
Node* newNode = new Node(value);
newNode->prev = list;
list->next = newNode;
list = newNode;
}
int main()
{
Node* linkedList = new Node(1);
addNode(linkedList, 2);
// TODO: release memory
system("PAUSE");
return 0;
}
Ваше утверждение "параметр функции указателя по сути передается по ссылке" не совсем верно. Вы должны учесть, что когда вы передаете указатель на функцию, а указатель указывает на что-то, вы действительно передаете две вещи:
Поэтому, если указатель передается по значению, у вас есть:
В этом случае вы можете изменить в функции pointee, но вы не можете изменить указатель.
Если указатель передан по ссылке, у вас есть:
В этом случае вы можете изменить оба указателя и указателя.
Это зависит. В вашем случае, когда вы меняете указатель внутри функции, тогда да, вы должны передать указатель по ссылке. Если, с другой стороны, вы не меняете указатель внутри функции, тогда нет причин добавлять другой уровень косвенности и передавать по ссылке.
И нет, указатели не передаются автоматически по ссылке, они передаются по значению, как и любой другой аргумент. Если вы не пройдете по ссылке, указатель будет скопирован, и вы будете работать только с копией, а не с оригиналом.
Ссылка здесь необходима, потому что вы пытаетесь изменить указатель, а также указатель.
Если вы передадите Node
по указателю, вызывающий объект увидит любые изменения указателя, но не указателя, так как копия указателя создается при вызове функции. Если вы передадите ссылку Node
по указателю, вызывающий будет видеть изменения для обоих.
linkedList
изменяется, но не связанный linkedList
.