指向指针的指针,作为操作链接列表的函数的参数

时间:2014-02-14 17:14:12

标签: c pointers linked-list

我正在尝试刷新我的C并且一直在审查数据结构和指针操作。有人可以向我解释为什么有必要在这个链表反向函数中使用指向头的指针?由于head总是在函数中被解除引用一次(* head),我们难道不能只接受一个普通的Node *作为这个函数的参数并放弃解除引用吗?提前谢谢!

struct Node{
    int key;
    struct Node *next;
};



struct Node* reverse(struct Node** head){
    Node *parent = *head;
    Node *me = parent->next;
    Node *child = me->next;

    parent->next = NULL;
    while(child) {
        me->next = parent;
        parent = me;
        me = child;
        child = child->next;
    }
    me->next = parent;
    *head = me;
    return *head;
}

1 个答案:

答案 0 :(得分:1)

如果您没有传入Node**参数并且只使用了Node*参数,那么这一行

 *head = me;

需要实现为

 head = me;

但是,当head随后将按值传递时,会导致head副本传递给该函数。然后修改你的函数makea只适用于这个副本而不是你传递的参数。

每当需要一个函数来修改参数时,你需要通过引用或通过指针传递它。在您的情况下,您需要Node**来修改它所指向的Node*

您还可以使用对Node*参数的引用。

作为一个荒谬的例子,考虑这个功能

void ChangePointer(int* x)
{
    x = NULL;
}

void ChangePointer_2(int** x)
{
    *x = NULL;
}

int main()
{
    int* p = new int(1);
    ChangePointer(p); 
    // p is not NULL. The function changed the copy
    // of p because it was passed by value.

    ChangePointer_2(&p);
    // now p == NULL;
}