我有一个非常简单的链接列表。如果我通过引用传递列表,我的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;
}
答案 0 :(得分:2)
这取决于。在您更改函数内部指针的情况下,您应该通过引用传递指针。另一方面,如果你没有更改函数内的指针,那么就没有理由添加另一个间接层并通过引用传递。
不,指针不会通过引用自动传递,它们像任何其他参数一样通过值传递。如果您没有通过引用传递,则指针将被复制,您只能对副本进行操作而不是原始文本。
答案 1 :(得分:2)
此处的引用是必要的,因为您正在尝试更改指针以及指针。
如果通过指针传递Node
,调用者将看到对指针的任何更改,但不会指向指针,因为在调用函数时会生成指针的副本。如果您通过指针引用传递Node
,则调用者将看到对这两者的更改。
答案 2 :(得分:1)
您的语句&#34;指针函数参数本身就是通过引用&#34;并非完全正确。你需要考虑到当你将指针传递给一个函数,并且指针指向某个东西时,你真的传递了两件事:
因此,如果指针是按值传递的,那么您有:
在这种情况下,您可以在函数中修改指针,但是您无法修改指针。
如果指针是通过引用传递的,那么您有:
在这种情况下,您可以修改指针和指针。