C语言之结构体就这样被攻克了!
扫描二维码
随时随地手机看文章
「本文目录」
- 结构体的声明与定义
- 声明
- 定义
- 访问结构体成员
- 初始化结构体
- 对齐
- 结构体嵌套
- 结构体数组
- 结构体指针
- 传递结构体信息
- 传递结构体变量
- 传递指向结构体变量的指针
- 动态申请结构体
- 实战:建立一个图书馆数据库
- 单链表
- 在单链表中插入元素
- 搜索单链表
- 插入结点到指定位置
- 删除结点
- 内存池
- typedef
- 给数据类型起别名
- 结构体的搭档
- 进阶
- 共用体
- 声明
- 初始化
- 枚举
- 位域
有的时候,我们所遇到的数据结构,不仅仅是一群数字或者是字符串那么简单。比如我们每一个人的学籍信息,学号是一个长整数,名字却是字符;甚至有更复杂的情况,这种问题在现实生活中并不少见。我们之前学过一种叫数组的数据结构,它可以允许我们把很多同类型的数据集中在一起处理。相对于之前,这已经是一次极大的进步。但是,新的问题,往往又会出现,这个时候,我们就得上更高端的装备——结构体。相比于数组,结构体有以下的更强大的优势:
- 批量存储数据
- 存储不同类型的数据
- 支持嵌套
结构体的声明与定义
声明
结构体的声明使用struct
关键字,如果我们想要把我们的学籍信息组织一下的话,可以这样表示:struct Info
{
unsigned long identifier;//学号,用无符号长整数表示
char name[20];//名字,用字符数组表示
unsigned int year;//入学年份,用无符号整数表示
unsigned int years;//学制,用无符号整数表示
}
这样,我们就相当于描绘好了一个框架,以后要用的话直接定义一个这种类型的变量就好了。定义
我们刚刚申请了一个名叫Info
的结构体类型,那么理论上我们可以像声明其他变量的操作一样,去声明我们的结构体操作,但是C语言中规定,声明结构体变量的时候,struct
关键字是不可少的。struct 结构体类型名 结构体变量名
不过,你可以在某个函数里面定义:#include
struct Info
{
unsigned long identifier;//学号,用无符号长整数表示
char name[20];//名字,用字符数组表示
unsigned int year;//入学年份,用无符号整数表示
unsigned int years;//学制,用无符号整数表示
};
int main(void)
{
/**
*在main函数中声明结构体变量
*结构体变量名叫info
*struct关键字不能丢
*/
struct Info info;
...
}
也可以在声明的时候就把变量名定义下来(此时这个变量是全局变量):#include
struct Info
{
unsigned long identifier;//学号,用无符号长整数表示
char name[20];//名字,用字符数组表示
unsigned int year;//入学年份,用无符号整数表示
unsigned int years;//学制,用无符号整数表示
} info;
/**
*此时直接定义了变量
*该变量是全局变量
*变量名叫info
*/
int main(void)
{
...
}
访问结构体成员
结构体成员的访问有点不同于以往的任何变量,它是采用点号运算符.
来访问成员的。比如,info.name
就是引用info
结构体的name
成员,是一个字符数组,而info.year
则可以查到入学年份,是个无符号整型。比如,下面开始录入学生的信息://Example 01
#include
struct Info
{
unsigned long identifier;//学号,用无符号长整数表示
char name[20];//名字,用字符数组表示
unsigned int year;//入学年份,用无符号整数表示
unsigned int years;//学制,用无符号整数表示
};
int main(void)
{
struct Info info;
printf("请输入学生的学号:");
scanf("%d",