Do指针参数需要通过引用传递

Do Pointer Parameters Need To Be Passed By Reference

本文关键字:引用 指针 参数 Do      更新时间:2023-10-16

我有一个非常简单的链表。如果我通过引用传递列表,我的addNode(Node* &list, int value)函数只会向链表添加一个新节点。如果我按值传递列表,则不会:addNode(Node* list, int value)

我知道pass by valuepass 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;
}

这取决于情况。在您更改函数内部指针的情况下,是的,您应该通过引用传递指针。另一方面,如果您不更改函数内部的指针,那么就没有理由添加另一个间接级别和引用传递。

不,指针不是通过引用自动传递的,它们和其他参数一样是通过值传递的。如果不通过引用传递,指针将被复制,并且只对副本进行操作,而不对原始指针进行操作。

此处的引用是必要的,因为您正试图更改指针以及指向对象

如果通过指针传递Node,调用方将看到对指针对象的任何更改,但不会看到对指针的更改,因为在调用函数时会生成指针的副本。如果通过指针引用传递Node,则调用者将看到对这两个值的更改。

您的语句"指针函数参数固有地通过引用传递"并不完全正确。你需要考虑的是,当你传递一个指向函数的指针,而指针指向某个东西时,你实际上传递了两件事:

  • 指针
  • 尖头

因此,如果指针是按值传递的,则您有:

  • 通过值传递的指针
  • 通过引用传递的指针对象

在这种情况下,您可以在函数中修改指针对象,但不能修改指针。

如果指针是通过引用传递的,则您有:

  • 通过引用传递的指针
  • 通过引用传递的指针对象

在这种情况下,您可以同时修改指针和指针对象。