目录
- 前言
- 结构体和数组的区别
- 结构体的声明
- 方式一(不带 tag)
- 方式二(带 tag)
- typedef 与结构体
- typedef 在结构体的使用
- 结构成员的访问
前言
结构体是在数据结构中经常使用的一类,下面对结构体进行一些知识的补充。
结构体和数组的区别
结构体的声明
结构体声明的基本形式
structtag{member-list}variable-list;参数解释
- tag:结构体的名字
- member-list:成员列表
- variable-list:变量列表
在结构体声明的时候,我们常会看到下面两种声明的方式
方式一(不带 tag)
struct{intage;charsex;}man;大多数初学者看到这一长串的时候会发昏,这样的声明形式和一般的int a的形式有什么关联呢?
方式二(带 tag)
structpeople{intage;charsex;};structpeopleman1,man2;我们可以看到方式二的好处就是减少了变量声明的冗余。如果像方式一那样,你在另一个地方要声明一个相同的变量,就必须把前面的成员列表那一大部分也带上。
struct peple作为整体相当于数据类型的名字,也就是说struct people和int,float是同一级别的概念。
同时使用方法一还会存在下面这个问题
struct{intage;charsex;}man1;struct{intage;charsex;}man2;man1=man2;// 报错虽然 man1 和 man2 是一样的结构体类型,但是编译器会认为是不同的类型。
但如果用方式二就不会报错
structpeople{intage;charsex;};structpeopleman1,man2;// 或者为了好理解,也可以是// struct people xiaozhang , xiaoli;structpeopleman3;man1=man3;// 这样就正确typedef 与结构体
typedef 也是在数据结构中常用的 C/C++ 的东西。它的英文翻译是 “类型定义”。下面就来看看它的用法。
我更喜欢叫 typedef 为语义化,因为很大程度上使用 typedef 是为了语义化,是需要结合现实世界的。
typedefintMoney这句代码的意思就是,从今往后,Money 就可以代表 int 使用了。
Money money;// 此时 money 就是 int 类型,等价于 int money;至于为什么使用 typedef 这样的方式,个人最大的感受就是语义化吧,当然 typedef 为什么要使用的其他原因可以自行谷歌。
typedef 在结构体的使用
先来看看这段代码
typedefstructpeople{intage;charsex;}chinese;很多人会和结构体的声明弄混,其实不是,我用图例来解释就清楚了(对比结构体声明的图例,观察二者的区别)
其中,people 表示的是结构体的名字,正如前面所说,struct people同int,bool这些是同一级别的概念。
其中 people 是结构体的名字,Chinese 是类型别名。
typedefstructstructTagName{intage;charsex;}Name;当然,用 typedef 的时候,你也可以省略结构的标签(structTagName),所以你有时还会看到下面的写法
// typedef 匿名化typedefstruct{intage;charsex;}chinese;下面来看看数据结构单链表里面比较难理解的对单链表如何去定义
typedefstructNode_1{intdata;structNode_1*next;}Node_2;typedefstructNode_1*linkList;// 通常代码会把 Node_1 和 Node_2 都写成一样的 Node,具体的原因我也不是很清楚,// 有知道的同学可以在下面留言// 但是仅就代码而言 Node_1 表示的是结构体的名称,而 Node_2 表示的是代替简写// struct Node_1 的名称。// 特别的是 struct Node_1 定义的是一个单独的结点,所以我们看到 struct Node_1// *next; 其本意是只该结点的下一个结点// 而 typedef struct Node_1 *linkList; 表示的是一个结构体指针,有了指针,我们就// 可以通过 malloc 函数将一个单独的结点扩充成一个链表了。// 所以我们在定义 *linkList 的时候,typedef Node_2 *linkList; 和// typedef struct Node_1 *linkList; 都是正确的。结构成员的访问
主代码
structpeople{intage;charsex;};structpeopleman1,man2,man3,*man4;
一个访问 typedef 定义的结构体的示例
// c++ 版本#include<iostream>usingnamespacestd;intmain(){typedefstruct{intage;string name;}people,*ppeople;// 点操作符people zhangsan={13,"zhangsan"};cout<<zhangsan.age<<endl;// 13cout<<zhangsan.name<<endl;// zhangsan// 箭头操作符ppeople lisi=&zhangsan;lisi->age=17;lisi->name="lisi";cout<<lisi->age<<endl;cout<<lisi->name<<endl;return0;}图解