学习数据结构时对指针和链表很迷糊,也就自己总结 一下,如果有错误或者理解上的错误欢迎指正,谢谢
指针
指针是什么,指针就是指针类型,就和int 类型,float类型等一样,而对于指针个人当时学习的时候总被*弄得迷糊,
*的作用:
1:类型说明符,int*p,定义p是一个指向整型的指针变量,p就是这个地址,具体说明教科书有。所以有int *p;p=&a或者是int *p=&a;在这里时强调一点int* p,可以写成这种形式,是指p所指向的数据域是整型,
2:指针指向的值的运算
3:野指针
当定义一个指针变量后,需要对其进行初始化,p=NULL,或者p=&a;如果不将其初始化,那么p没有一定的指向,这时会有一定的危险,同时在调用free后,此时需要将指针p=NULL,如若不然,则此时的p为野指针,所以要将其p=NULL
链表Linklist L和Link *L的区别
1:L=(Linklist *)malloc(sizeof(lnode))对吗?
2:L=(Linklist)malloc(sizeof(lnode))对吗?
3:**L=(Linklist)malloc(sizeof(lnode))对吗?
首先看一下单链表的存储结构(参考严蔚敏的教材)
typedef struct lnode{
Elemtype data;
struct lnde *next;
}lnode, *Linklist
首先Linklist 是什么?
Linklist是一个指针变量,指向lnode的结构体的指针变量,
Linklist L是什么?怎么去理解,我是这样理解的,我们学过了整型变量的定义 int a;a 是一个整型变量,同时我们可以理解Linklist L,定义一个变量L是Linklist型,此时的L
也是一个指针变量,指向结构体Lnode,此时的L是个一级指针,同理Linklist *L,把L换成q是没有关系的,所以就变成了Linklist *q,同理*p是个指针变量,指向lnode,此时我们又回到了指针符号*的作用上,是取值运算,取p所指向的是个指针,也就是说指针p指向指针,所以此时的指针p是个二级指针
malloc用法:
(l类型*)malloc(sizeof(lnode))是系统分配一个大小为lnode的内存,并把这个内存的首地址转换为什么类型的指针,Linklist本身是一个指针,此时Linklist *则是一个二级指针
所以第一个不对
注第二个中的L是Linklist *L中的L
我们刚才说了此时的L是二级指针,所以也不正确
看第三个**L可以这样理解*(*L),
即为取值,所以第三个也不成立
二级指针和一级指针
一级指针指向数据域,而二级指针指向指针域,具体见书本