【C语言笔记】结构体
我们都知道C语言中变量的类型决定了变量存储占用的空间。当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float。
那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,该怎么做呢?
如当要保存三个学生的信息时,
方法一是:
char *name1,*name2,*name3; // 三个学生的姓名
int num1,num2,num3; // 三个学生的学号
int age1,age2,age3; // 三个学生的年龄
方法二是:
// 创建结构体模板
struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
};
// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;
显然,方法二跟更清晰,因为它把name、num、age都集成在一个模板,要用的时候只要套用模板进行创建即可。这就是结构体。
结构体(struct)是由一系列具有相同类型或不同类型的数据项构成的数据集合,这些数据项称为结构体的成员。如上面的student结构体包含三个成员,分别是name、num、age。
结构体是C语言中的一种构造类型。C语言的数据类型如下图:
// 创建结构体模板struct student
struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
};
// 使用该结构体模板创建三个变量stu1, stu2, stu3
struct student stu1, stu2, stu3;
此处,student是结构体名,该名字是由任意定义的,但是尽量起个有意义的名称。其相当于一个模板,可以使用这个模板去定义变量stu1,stu2,stu3。定义的时候不要忘了struct。
// 定义三个结构体变量stu1, stu2, stu3
struct
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}stu1, stu2, stu3;
相对于方法一,此处省略了结构体名。虽然更简洁了,但是因为没有了名字,后面就不能用该结构定义新的变量。
// 给结构体模板struct student重新命名为student
typedef struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}student;
// 使用student创建三个结构体变量stu1, stu2, stu3
student stu1, stu2, stu3;
此处使用typedef为结构体模板struct student定义一个别名student,关于typedef的介绍移步至#define与typedef的区别?进行查看。使用typedef给结构体创建一个别名,这在实际编程用使用非常广泛,如STM32单片机固件库中,使用得很多,如下图:
初始化变量和数组如下:
int count = 0;
int arr[7] = {0,1,2,3,4,5,6};
结构体变量是否也可以这样初始化?是的,可以。与初始化数组的语法类似:
struct student stu1 =
{
"ZhengNianJun", // 名字:正念君
520, // 学号:520
23 // 年龄:23
};
struct student stu1 =
{
.name = "ZhengNianJun"
};
struct student stu1 =
{
.age = 24,
.num = 520,
.name = "ZhengNianJun"
};
struct student stu1 =
{
.num = 520,
.name = "ZhengNianJun",
1314
};
结构体成员的访问需要借助结构体成员运算符——点(.)。如:
student stu1; // 定义一个结构体变量stu1
stu1.name = "ZhengNianJun"; // 给stu1的成员name赋值
stu1.num = 520; // 给stu1的成员num赋值
stu1.age = 23; // 给stu1的成员age赋值
#include <stdio.h>
typedef struct student
{
char *name; // 学生名字
int num; // 学生学号
int age; // 学生年龄
}student;
int main(void)
{
student stu1; // 定义一个结构体变量stu1
/* 给结构体变量stu1的成员进行赋值 */
stu1.name = "ZhengNianJun";
stu1.num = 520;
stu1.age = 23;
printf("\n============================================\n");
printf("My name is %s\n", stu1.name);
printf("My num is %d\n", stu1.num);
printf("My age is %d\n", stu1.age);
printf(