关于在链接列表中使用时取消引用指针
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第一版发布的时候)
在这里,我尝试创建一个链表并创建一个函数,它将任何给定的数字添加到链表的起始位置。
#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第一版发布的时候)