struct node*head和struct node**head之间有什么区别?

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)

pb2*_*b2q 9

有了这个功能签名:

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反映在函数外部.


SiB*_*SiB 2

第一个是指向节点的指针,它是一个结构。

(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 *在方法中通过引用传递。