关于结构体指针和 typedef 的用法的介绍——以数据结构例题为例
关于结构体指针的问题
想必大家在学数据结构的时候,经常要去定义结构体和指针来完成基础构造,结构体指针也是必不可少的一步,
我们来将代码简化一下,得到类似以下这样的一段代码:
typedef struct node{
float data;
struct node *next;
}ListNode,*LinkList;
那么其中 struct node *next; 和
ListNode,*LinkList; 的含义 以及 typedef 在这段代码中又起着什么样的作用 ?
一、结构体概念
我们先将结构体搞清楚:
概念 : 用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体。
声明一个结构体类型的一般形式为:
struct 结构体名
{成员表列};
由此可以看出结构体的时候,类型并非只有一种,而是可以设计出许多种结构体类型,如: struct Teacher ; struct Student 等, 他们各自包含不同的成员。
前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并没有具体数据,系统对之也不分配存储单元。相当于设计好了图纸,但并未建成具体的房屋。
二、定义结构体变量的三种形式
为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。
例如:声明结构体类型 struct Student , 可以用它来定义变量:
struct Student{
//成员列表
};
// struct Student 为结构体类型名,
//student1 , student2 为结构体变量名
struct Student student1,student2;
定义结构体变量有三种形式,以上为一种形式(先声明结构体类型,再定义该类型的变量),还有两种形式
形式2(在声明类型的同时定义变量)
struct Student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student1,student2;
形式3(不指定类型名而直接定义结构体类型变量)
struct
{
成员表列
}变量名表列;
//这里指定了一个无名的结构体类型
由以上这三种形式也可以知道,我们本题为第二种形式。
这里有几点需要注意:
-
结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。
-
在编译时,对类型是不分配空间的,只对变量分配空间。
-
结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。
-
对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
上面结构体的基本概念已经了解了,我们再来看看指向结构体变量的指针是什么:
首先,我们需要明白:
-
指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。
-
指针变量的基类型必须与结构体变量的类型相同。例如:
struct Student *st;
说白了,就是在将指针在结构体层次上进行了再定义,结构体数组指针用法也与结构体指针类似。
三、重回本题
我们先将 typedef 去掉 , 变成我们熟悉的样子,
struct node{
float data;
struct node *next;
}ListNode,*LinkList;
我们将他简化一下:
struct node{
//成员列表
}ListNode,*LinkList;
可以看到这种写法是我们上文提到的形式二,struct node 为结构体类型,ListNode 和 *LinkList 分别为结构体变量和结构体指针。
其中成员列表为:
float data;// float 类型的数据data
struct node *next;//这个也为结构体 node 的指针next
到这里有的小伙伴可能就要疑惑了 ,“怎么一个结构体声明了两个结构体指针啊,是一个不够使吗”, 这当然不是,那么原因,就在 typedef 这里
typedef 关键字:可以使用它来为类型取一个新的名字
(不了解 typedef 的小伙伴可以看看菜鸟教程:(点击链接即可)其中也举例了结构体)
我们再来看这个结构体,
typedef struct node{
float data;
struct node *next;
}ListNode,*LinkList;
现在再看这个就一下子明朗了,
**所以这里是给 struct node 起了一个别名 为 ListNode **
这里就会有小伙伴误认为 LinkList 则也为其结构体指针 next 的别名 ,这里就错了(小主一开始也是这样以为的[😓],哎,8说了,过程十分艰苦)
我们直接看在程序里他是什么意思
通过这个我们能清楚的看到:
- next 是一个结构体内的指针,而 ListNode 和 *LinkList 就是一种别名。
- *LinkList 等价于 struct node * 。
- 这么定义一方面是为了书写的方便(后边编写程序不用老写 struct node 了)
- 一方面是为了更好的识别其意义(让人一眼就知道是什么意思)
四、最后
希望对大家有所启发!😃
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。