aka*_*ash 5 c pointers linked-list
我正在尝试对链表进行排序.我很困惑何时使用struct node*head
以及何时使用struct node **head
,可以使用它们来完成实现.
我什么时候应该使用:
void sortedinsert(struct node **head)
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用:
void sortedinsert(struct node *head)
Run Code Online (Sandbox Code Playgroud)
有了这个功能签名:
void changeNode(struct node *head)
Run Code Online (Sandbox Code Playgroud)
您有一个指向该节点的指针,因此您可以更改该结构.您无法更改变量头指向的内容.我们假设以下定义struct node
:
struct node
{
int field1;
struct node *next;
}
Run Code Online (Sandbox Code Playgroud)
使用给定的函数签名,并struct node
考虑以下操作可以更改函数中的结构:
void changeNode(struct node *head)
{
head->field1 = 7;
head->next = malloc(sizeof(struct node));
}
Run Code Online (Sandbox Code Playgroud)
C是按值传递:当我们将变量传递给函数时,函数会获得一个副本.这就是为什么我们将指针传递给a struct node
,以便我们可以更改它,并在函数外部具有这些更改的效果.但是我们仍然只获得指针本身的副本.所以以下操作没用:
void changeNode(struct node *head)
{
// we're only changing the copy here
head = malloc(sizeof(struct node));
}
Run Code Online (Sandbox Code Playgroud)
更改head
将不会反映在函数外部.为了改变head
指向的内容,我们必须使用额外的间接级别:
void changeNode(struct node **head)
{
// now we're changing head
*head = malloc(sizeof(struct node));
// alternately, we could also do this:
*head = NULL;
}
Run Code Online (Sandbox Code Playgroud)
现在,更改将head
反映在函数外部.
第一个是指向节点的指针,它是一个结构。
(struct node *) head;
Run Code Online (Sandbox Code Playgroud)
定义head
为一个可以存储 a 的地址的变量node
。
这允许node
在方法中通过引用传递。
第二个是指向节点的指针,该节点是一个结构体。
(struct node **) head;
Run Code Online (Sandbox Code Playgroud)
定义head
为可以存储另一个变量的地址的变量,该变量的地址为node
。
这允许node *
在方法中通过引用传递。