对结构体以及指针结合数据结构的初步理解
初学数据结构时,被指针和结构体绕晕了,数据结构的一个存储结构,硬是看得我莫名其妙。后来听了教导,摸清了点,但现在也是有点模糊的。所以就写下来吧,有助于理清楚条理,若有错误,请多多指教。
首先说指针。类型关键字 *变量名 ;如 int *p;这里的*只是类型说明符,它只是代表定义的是指针变量的意思。如这个,它的意思就是定义了一个指向整型的指针变量p。当然,这是没有初始化的,会乱指向的指针,是危险的,叫野指针,所以还得初始化。所谓初始化就是让它指向NULL,或者是指向某个确定的地方。如:int a;*p=&a;就是让指针指针P指向整型a的意思。或者是指向NULL,即int *p=NULL。要格外注意,这里的*依然是类型说明符,不要与取值运算符混合了!
我以前是一直混淆的,所以强调一下。应该这么辨别的:int a;int *p=&a;你看这时候是在定义对吧,定义的肯定是类型,这个定义的就是int型指针,所以它和取值无关。不能理解为,将&a的值赋值给指针变量p所指向的变量。它只是有一次指针,所以就是一级指针了。
然后说二级指针。int a=5;int *p=&a;int *q=&p;首先定义了一个指针p,然后,再定义了一个指向一级指针p的指针q,对吧,对于指针q来说,就是指向指针的指针,有了两次指向了,所以就是二级指针了。那*q所代表的意思就是,取出q所指向的变量的值,和一般变量有点不一样,这里指针q所指向的变量也是一个指针变量p,要记得一点,所谓的值,并不是只有int ,float ,double 等,地址本身也是一个值,地址值。所以*q其实也就是取出指针变量p,因为指针q是指向指针p的对吧,就相当于int a=2;int *Q=&a;*Q=2;换做一级指针来看,指针Q指向a对吧,所以*Q也就是取值,取出指针变量Q所指向的变量a,也就是2。切记,这里,*Q=2是取值,你看它前面没有int 对吧,所以不是定义类型!同理,*q也就是取出指针变量P。*q=p。再看,**q。这里理解,*(*q),*q=p,是一级指针变量了,对一级指针变量取值*(*q),其实也就相当于*p,也就是取出指针p所指向的变量,也就是5.**q=*p=5.其实就是*p,只是又绕了一次,先去找到了p的地址,然后才用p去取出p所指向的变量。
附上代码一串。
#include<stdio.h>
int main(void)
{
int a=5;
int *p=&a;
int **q=&p;
printf("a=%d,*p=%d,*q=%d,**q=%d\n",a,*p,*q,**q);
}
我执行后结果为:a=5,*p=5,*q=1703740(一串地址),**q=5,和*p一样的值。和我所述结果一样。
然后到讲结构体了,代码如下:
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkList;
首先,定义了一个Node类型的结构体。其结构体成员有ElemType data;struct Node *next;注意,ElemType 是什么类型,需要你宏用声明的,比如是int 整型,#define int ElemType,其实也就是int ,只是为了抽象化,代表全部,所以这样定义,就直接写,int ElemType也没错。书上都是伪代码,这个问题让我困惑了好久,为什么就是不能执行呢?!所以说说。然后,struct Node *next;其成员中,又定义了一个指向Node的指针*next,也就是指向自己。这样可能不好理解,我们看教材的图,*next就是 在定义好的结点上移动对吧,那这不就是指向自己么?所以用Node定义。这个问题我也是好几天才明白的,惭愧。。而*LinkList 是指向结构体Node的指针。LinkList L,就是定义一个和LinkList 一个类型的指针变量,这个关系就好比int a;就是定义了一个和int 一样为整型的变量a.LinkList *q,则是定义了一个和指针LinkList 一样的指针变量,因为*q是指针,所以它得有指向,首先,他是和LinkList一个类型的,而LinkList是指针当然也有指向,它指向Node,*q和它一样,当然也是指向了Node!这点要弄明白,不然绕晕你,像我一样一直在死胡同里绕。
再来两个结构体:
//队列的两个结构体
typedef struct Node
{
QueueElemType data;
struct Node *next;
}LinkQueue;//这里没定义指针
typedef struct
{
LinkQueueNode *front;//这里却定义了指针
LinkQueueNode *rear;
}LinkQueue;
//这是我教材的,耿国华版
//再看严蔚敏版
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr//这里已经定义指针了
typedef struct
{
QueuePtr front;//这里的的front,rear没有加*是因为,前面定义的QueuePtr已经是指针。
QueuePtr rear;
}LinkQueue;
//昨天一开始没注意,把我看懵了,也强调一下。还以为我还是把指针理解错了,纠结了好久。。。
最后还有这个结构体运算符。"."是成员运算符,是直接取出某结构体里面的成员的值的意思。"->",是指向运算符,这个用于指针形式。这两点要分清。还有一点要强调,成员就算是指针,也就是说明取出那个指针或者是指向那个指针。这些都是些基础,我自己把它弄混了,晕了很久,这样总结一下,要清醒点。如果这些没弄清楚,数据结构肯定是学的蒙的,就像那个结构体,或者是申请内存malloc,我以前一直都是依葫芦画瓢,直接那样写,但是几个*,我就不知道了,还好问了现在基本清楚了。。。可以接着往后的串学了,不然一直不踏实。。。

浙公网安备 33010602011771号