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

时间:2018-02-18 17:06:38

标签: c linked-list dynamic-memory-allocation singly-linked-list

在此之前被标记为dup,我已阅读了 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
我仍然在努力应对双星号的逻辑步骤。我知道在链表中我需要创建一个新节点,为它动态分配空间,然后将新节点重新标记为头部。
我只是不理解&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);

2 个答案:

答案 0 :(得分:0)

由于调用者将&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中的不良做法。

答案 1 :(得分:0)

实际上,为了理解发生了什么,你必须了解指针的指针以及deference运算符*的含义。 然后你可以按照代码:

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;