C语言中LinkList L和LinkList *L 的区别

LinkList L 和 LinkList *L二者的区别
如果调用函数里要修改指针本身,就要向函数传递指针本身的地址,即二级指针 LinkList *L,如果只是简单的访问读取指针指向的内容,就用一级指针就可以了,即LinkList L
举例:

#include<cstdio>
#include<stdlib.h>
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
void CreateList( LinkList header){ // LinkList *L=LNode *header
	header=(LNode*)malloc(sizeof(LNode));//此处调用函数要修改指针本身!!!	在不用LNode **head的情况下,对head就行修改,head不会传回到主函数中,head是一级指针,*head是二级指针
	header->data=11;
	header->next=NULL;
}
int main(){
	LinkList head=NULL;
	CreateList(head);
	if(head!=NULL){
		printf("%d\n",head->data);//什么都没有输出 
	}
	free(head);
	return 0;
}

正确写法

#include<cstdio>
#include<stdlib.h>
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
 
//初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用**header
//**header不仅能修改指针所指向变量的值,也能够修改指针本身的内容 
void CreateList(LNode **header){ //(LinkList *header)
	(*header)=(LNode*)malloc(sizeof(LNode));//(LinkList)malloc(sizeof(LNode));
	(*header)->data=11;
	(*header)->next=NULL;
}
int main(){
	LinkList head=NULL;
	CreateList(&head);//传递指针本身的地址 
	if(head!=NULL){
		printf("%d\n",head->data);//11 
	}
	free(head);
	return 0;
}

子函数只是读取,访问,则可以用LinkList L
如:

#include<cstdio>
#include<stdlib.h>
typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
void CreateList(LNode *header){
	header->data=11;
	header->next=NULL;
}
int main(){
	LinkList head;
	head=(LNode*)malloc(sizeof(LNode));//直接在主函数里用malloc修改head
	CreateList(head);
	if(head!=NULL){
		printf("%d\n",head->data);//输出11 
	}
	free(head);
	return 0;
}
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页