【C语言】struct结构体(超详解)
- 一、结构体是什么?
-
- 1.为什么有结构体
- 2.结构体简介
- 3.结构体的声明
- 4.结构体的定义
- 5.结构体变量的初始化
- [6.结构体访问操作符( . )](#6.结构体访问操作符( . ))
- 6.结构体数组
- 7.结构体指针(最重要)
- [8.结构体访问操作符( -> )](#8.结构体访问操作符( -> ))
- 结语
前言:
本期开始详解结构体,由于文章过长,所以分了几篇文
包括结构体概念,结构体的内存对齐以及位段
若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持
谢谢大家 ! ! !
一、结构体是什么?
1.为什么有结构体
结构体是C语言中的自定义数据类型,用于描述现实中的复杂对象。而C语言单一内置类型如char、int、float等无法完整描述现实中的复杂对象。
例如:
在生活中描述一名在校学生,有姓名、性别、学号、班级、成绩等等,其中既有int整型,又有float浮点型,还有char字符型等等
此处的在校学生就是一个复杂对象,单一内置类型如char、int、float等无法完整描述该在校学生
2.结构体简介
结构体就是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
姓名、性别、学号等就可以集合成一个结构体 。
3.结构体的声明
struct tag//结构体标签名
{
member - list;//成员变量列表
}variable - ist;//变量列表
tag : 结构体标签名(自定义)
struct tag :结构体类型
member - list : 成员变量列表(至少一个成员)
variable - ist : 可选的变量列表(可直接创建变量)
4.结构体的定义
这里我们定义一个结构体包含一名学生的姓名(name)、年龄(age)、成绩(score)
字符数组存储学生姓名
整型存储年龄
浮点型存储成绩
代码演示:
先定义结构体类型,再定义结构体变量
c
struct student//结构体变量名
{
char name[20];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
struct student S;//定义结构体变量
5.结构体变量的初始化
代码演示:
c
struct student//结构体变量名
{
char name[20];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量
初始化后 xiaobai , 18 , 88.8 这些信息就被输入到结构体变量 S 中了
那么该怎么使用这个结构体变量呢?
6.结构体访问操作符( . )
- 点操作符:( . )
通过点操作符我们可以对结构体成员进行访问
将成员一一拿出来
语法 :结构体变量名 . 结构体成员名
示例 :S . name 访问字符成员name
代码演示:
c
#include <stdio.h>
struct student//结构体变量名
{
char name[20];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量
int main()
{
printf("%s\n%d\n%f", S.name, S.age, S.score);
//依次打印出结构体成员
return 0;
}
运行结果:

6.结构体数组
我们说一个结构体可以表示一名学生的信息,但是如果我想要一整个班上人的信息呢,那又该怎么办?
这时候就要用到结构体数组
将多个同种类型的结构体变量整合到一起成一个数组
这就是结构体数组
代码演示:(这里只写了3名学生)
c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct student//结构体变量名
{
char name[10];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
int main()
{
int i;
struct student S[3];
//定义结构体数组
for (i = 0; i < 3; i++)
{
scanf("%s %d %f", &S[i].name, &S[i].age, &S[i].score);
//对结构体成员一一输入
}
printf("\n\n");
for (i = 0; i < 3; i++)
{
printf("%s %d %.2f\n", S[i].name, S[i].age, S[i].score);
//对结构体成员一一打印
}
return 0;
}
运行结果:
(输入和输出:)

这里要注意输入和输出时结构体数组的形式
7.结构体指针(最重要)
结构体指针就是指向结构体的指针 ,方式与定义与其他类型变量的指针类似。
语法:struct student * ps = &S ;
将结构体变量 S 的地址赋给指针 ps
这个 ps 就是结构体指针
代码演示:
c
#include <stdio.h>
struct student//结构体变量名
{
char name[20];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量
struct student* ps = &S;
//将结构体变量 S 的地址赋给指针 ps
//ps的类型是struct student型
以上代码中
ps的类型为struct student型,是一个结构指针
表示着该结构体的地址
8.结构体访问操作符( -> )
上面我们学习了点操作符( . )
语法是 :结构体变量名 . 结构体成员名而还存在一个结构体访问操作符( -> )
其语法是 :结构体指针 -> 成员名
和点操作符一样, -> 也可以用其对结构体成员进行访问
代码演示:
c
#include <stdio.h>
struct student//结构体变量名
{
char name[20];//姓名
int age;//年龄
float score;//成绩
}; //定义结构体类型
struct student S = { "xiaobai",18,88.8 };
//定义并初始化结构体变量
struct student* ps = &S;
//将结构体变量 S 的地址赋给指针 ps
//ps的类型是struct student型
int main()
{
printf("%s\n%d\n%f\n\n", ps->name, ps->age, ps->score);
//依次打印出结构体成员
return 0;
}
运行结果:

可以说
S.name 与 ps -> name 完全等价
我们可以视情况对两个操作符进行使用
结语
本期资料来自于:
https://legacy.cplusplus.com/
OK,本期的结构体详解到这里就结束了
由于文章过长,所以分了几篇文
若内容对大家有所帮助,可以收藏慢慢看,感谢大家支持
本文有若有不足之处,希望各位兄弟们能给出宝贵的意见。谢谢大家!!!
新人,本期制作不易希望各位兄弟们能动动小手,三连走一走!!!
支持一下(三连必回QwQ)