指向 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;
在这被标记为重复之前,我已经阅读了
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;