c语言链表二重指针,链表初始化为何使用二级指针的解释(指向指针的指针)

引言

在数据结构的学习过程中,有时候会遇到一些一时无法理解的问题,深究起来却是语言的底层的语法机制所限制.

就例如在链表的构建中,链表的初始化和销毁为何需要使用一个二级指针,而不是只需要传递一个指针就可以了,其问题的关键就在于c语言的参数传递的方式是值传递

那么,这篇文章就来聊一聊在链表的初始化中一级指针的传递和二级指针的区别.

一级指针和二级指针的区别

1.前提知识:c语言中参数传递的方式是值传递和地址传递

值传递:传递的是实参的副本,即形参是一个新开辟的类型一样,里面的内容一样,地址不一样的一个变量,主函数和被被调用函数用的是不一样的内存空间

地址传递:传递的是一个地址,实际上主函数和被调用函数共用的是同一块内存空间,被调用函数依然需要一个新的指针来保存起来这块地址

2.传递一级指针:无法对原指针指向第地址进行修改

一级指针实例:

#include

#include

#define MaxSize 100

typedef int ElemType;

typedef struct SingleNode{

ElemType data;

struct SingleNode *next;

}SingleNodeList,*Linklist;

void LinkedListInit(SingleNodeList *head){//用一个指针head接收传入的地址

Linklist p;

if((head=(SingleNodeList *)malloc(sizeof(SingleNodeList)))==NULL){

exit(1);//给head分配内存,改变了head指针指向的地址(注意这里的head只是LinkedListInit的head,不是主函数那个)

}

head->next=NULL;

}//这个函数结束后head被销毁了,主函数的那个head不变;

int LinkedList_PushFront(SingleNodeList *head,ElemType x){//2单链表头插入

SingleNodeList *q;

if((q=(struct SingleNode *)malloc(sizeof (struct SingleNode)))==NULL){

exit(1);

}

q->data=x; q->next=head->next;//头节点的数据域与指针域赋值

head->next=q;//头节点加入链表

return 1;

}

int LinkedList_PopFront(SingleNodeList *head,ElemType *x){//3单链表头删除

SingleNodeList *p=head,*q;

if(p->next==NULL){

printf("There is no data

你可能感兴趣的:(c语言链表二重指针)