在此之前被标记为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);
答案 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;