指针参数需要通过参考传递

时间:2014-09-12 10:35:02

标签: c++ pointers

我有一个非常简单的链接列表。如果我通过引用传递列表,我的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;
}

3 个答案:

答案 0 :(得分:2)

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

不,指针不会通过引用自动传递,它们像任何其他参数一样通过值传递。如果您没有通过引用传递,则指针将被复制,您只能对副本进行操作而不是原始文本。

答案 1 :(得分:2)

此处的引用是必要的,因为您正在尝试更改指针以及指针

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

答案 2 :(得分:1)

您的语句&#34;指针函数参数本身就是通过引用&#34;并非完全正确。你需要考虑到当你将指针传递给一个函数,并且指针指向某个东西时,你真的传递了两件事:

  • 指针
  • 指针对象

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

  • 按值传递的指针
  • 通过引用传递的指针

在这种情况下,您可以在函数中修改指针,但是您无法修改指针。

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

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

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