c - 指向作为操作链表的函数参数的指针

标签 c pointers linked-list

我正在尝试温习我的 C 语言,并且一直在复习数据结构和指针操作。有人可以向我解释一下为什么在这个链表反向函数中需要使用指向 head 的指针吗?由于 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;
}

最佳答案

如果您没有传入 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;
}

关于c - 指向作为操作链表的函数参数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21785485/

相关文章:

c - 大型数组的频繁随机访问

c - 如何将 char 指针转换为 int 指针?

performance - 不要指针抑制编译器优化?

c - 我的循环链表代码有什么问题?

c - 使用 C 发送 802.11 帧的最简单方法是什么?

c - 编写一个 c 函数,生成一个随机数,或一对随机数,或给定特定范围的三组随机数

c - 为什么我的 C 程序在 printf 之前停止?

c - 指向结构的指针数组,该结构中有指针

c++ - 链表C++中的内存管理错误

c++ - 如何创建一个空的双向链表?