指向 C 函数中指针的指针;链表

Pointer to Pointer in C function; Linked Lists

在这被标记为重复之前,我已经阅读了
In C, what does a variable declaration with two asterisks (**) mean?
I don't understand the implementation of inserting a new node in linked list
而且我仍然在为双星号的逻辑步骤而苦苦挣扎。我知道在链表中我需要创建一个新节点,为其动态分配 space 然后将新节点重新标记为头。
我只是不明白 &head 和双星号之间函数的逻辑步骤。这里双星号的实现指的是什么以及如何实现的?

void push(struct node** head_ref, int new_data)
{
    struct node* new_node = (struct node*)malloc(sizeof(struct node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

push(&head, 2);

由于调用者将 &head 作为第一个参数传递,

  • head_ref 等于 &head
  • *head_ref 等于 head.

因此,调用 push(&head, 2) 与在调用方中编写代码具有相同的净效果,如下所示。

/*   struct node **head_ref = &head;   */

struct node *new_node = malloc(sizeof(struct node));
new_node->data = 2;
new_node->next = head;       /*   new_node = (*head_ref) */
head = new_node;             /*    (*head_ref) = new_node */

我注释掉了 head_ref 的所有用法,因为它是函数的局部变量,调用者看不到。最后两个语句中的注释显示了等价性。

请注意,我还从 malloc() 中删除了结果的类型转换,因为这种事情在 C 中通常被认为是不好的做法。

确实,为了理解正在发生的事情,您必须理解什么是指向指针的指针以及遵从运算符 * 的含义。 然后你可以按照代码:

void push(struct node** head_ref, int new_data)

函数 push 有两个参数:指向指针的指针和 int 值。

head 是指向 struct node

类型变量的指针

struct node* head;

要正确调用 push,您必须获取 head 指针的地址。 它是通过使用 & 运算符完成的。那么&head就是指针的地址。

struct node **head_ref = &head;