关于在链接列表中使用时取消引用指针

Regarding dereferencing a pointer while using in linked lists

在这里,我尝试创建一个链表并创建一个函数,它将任何给定的数字添加到链表的起始位置。

#include <stdio.h>
#include <stdlib.h>
struct Node{
    int data;
    struct Node* next;
};
struct Node* head=NULL;

void Add(int n){
    head=(struct Node*)malloc(sizeof(struct Node));
    head->data=n;
    head->next=NULL;
    return;
}

现在我的疑问是,这里我们定义了head是一个数据类型struct Node的指针变量。在Add函数中,我们已经分配了分配给head指针变量的新内存地址。

但是我们在写head->data=n的时候,为什么不先解引用head,因为head是一个指针变量,所以它存储地址,像存储数据一样存储变量,为什么不应该是*head->data呢? *head->next=NULL.

类似

运算符 -> 已经是取消引用运算符。 head->data 等同于 (*head).data.

不行,你需要分两步做加法。先创建新节点并初始化,然后link加入链表。否则你会丢失整个列表,如下图:

#include <stdio.h>
#include <stdlib.h>

struct Node{
    int data;
    struct Node* next;
};

struct Node* head = NULL;

void Add(int n)
{

    // create the node.
    struct Node *node = malloc(sizeof *node);  /* better */

    // then initialize it.
    node->data=n;

    // now you can link it to the list
    node->next=head; // this must be done before touching header, so we don't lose header's value.
    head = node;

}

顺便说一下,不要强制转换 malloc() 返回的值,这会导致您在代码中出现您不希望出现的错误。如果你忘记 #include <stdlib.h> 你可以 运行 进入严重的 未定义行为 (在 64 位系统中更多,其中指针和整数具有不同的大小)演员表告诉compiler 你知道你在做什么,所以你可能会沉默来自编译器的警告和消息,这将有助于解决问题。不要这样做,因为很久以前就没有必要了(从STD-C第一版发布的时候)