在最近链表初始化时发现自己的代码总会出现问题,仔细检查后发现自己的函数参数上的基础,特别是二级指针的理解上不是特别到位,故写下这篇总结
首先,最重要的本质:
一切函数参数的传递都是值的传递
在传入参数时,函数会临时占据一片空间来储存这个值,在函数结束时这片空间便会被回收,这便是变量的时间域。所以想要在函数内部对变量进行操作,传入的值不能够被改变,并且可以对想要改变的变量进行操作,这时就可以使用指针传递参数,也就是传递地址。
但在初始化链表时,我们需要在函数内部为新创建的头节点分配内存,这时候其实就是要对存储的地址B进行操作(如图),这时候我们如果传入的是b的指针,也就是是b的地址,就会导致分配的空间在函数结束时马上就被回收。这个时候,我们传入的就不应该是变量的指针,而是变量指针的指针(在这个地方其实变量就成了指针变量)即二级指针
最终,我们实现的代码如下所示
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int coef;//系数
int exp;//指数
struct Node *next;
}Node,*LinkList;
void InitList(LinkList *L);
int main(){
InitList(&L);
return 0;
}
void InitList(LinkList* L){
*L=(Node*)malloc(sizeof(Node));
(*L)->next=NULL;
}
这个时候,我们应该传入一个二级指针,在main函数中的实参就应该是&L
当然也有另外一个方法进行初始化可以避免使用二级指针,就是不使用函数参数而是使用函数的返还值,列在下面
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int coef;//系数
int exp;//指数
struct Node *next;
}Node,*LinkList;
Node* _head();
int main(){
Node* L = _head();
return 0;
}
Node* _head() {
Node* L;
L= (Node*)malloc(sizeof(Node));
if (L == NULL)
exit(-1);
L->next = NULL;
return L;
}
//初始化链表