结构体
结构体是一种自定义数据类型,用于存储多个不同数据类型的数据。
和数组不同,数组是存储多个同种类型的数据的。
根据需求创建结构体数据类型,需求不一样创造出的结构体数据类型就不一样。
如何构造结构体类型:
格式
struct 结构体名
{
成员类型 成员名;
成员类型 成员名;
.....
};
struct : 结构体关键字
结构体名:自定义的名称
成员类型:所有学过的数据类型都可以作为成员类型,具体看存储什么数据。
成员名:自定义的名称
eg:统计学生信息:学号 姓名 班级 成绩
字符串 字符串 整型 实型
struct student
{
char sno[21];
char name[21];
int classNum;
float score;
};
结构体数据类型的名字:struct student ---( 类似:int float)
定义结构体类型的时候,不会开空间。
定义位置:
一般在使用之前定义即可,但是建议 放在预处理下面,函数的外面 -- 全局
头文件.h里面
给数据类型起别名 -- typedef
typedef 给已有的数据类型起别名
格式:typedef 数据类型 别名;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
给结构体类型起别名:
形式一:先定义结构体,然后再用typedef起别名。
struct student
{
char sno[21];
char name[21];
int classNum;
float score;
};
typedef struct student STU;
形式二--- 建议使用:
typedef struct student
{
char sno[21];
char name[21];
int classNum;
float score;
}STU;
// 结构体类型名字:struct student / STU
// 结构体类型名字:STU -- 并且这种结构体不能作为这个结构体本身的成员类型。
建议别名大写和变量进行区分。
结构体变量 -- 在内存里面开空间
定义:
结构体类型 变量名;
typedef struct student
{
char sno[21];
char name[21];
int classNum;
float score;
}STU;
// 数据类型:struct student / STU
STU a;
struct student b;
// 通过结构体变量获取成员然后对成员进行读写操作 --- 点语法 -- 结构体变量名.成员名
// 获取成员后要按照成员的类型进行下一步操作。
// "20200906" "小明" 1 96.5
strcpy(a.sno,"20200906");
strcpy(a.name,"小明");
a.classNum = 1;
a.score = 96.5;
变量初始化操作
typedef struct student
{
char sno[21];
char name[21];
int classNum;
float score;
}STU;
STU b = {"20200908","小红",2,100}; // {}是结构体的大括号,因为结构体有多个成员,就有 多个值。
// 按照定义结构体类型的时候的成员顺序赋值,不能跳跃赋值。
STU c = {"20200910","",3,100}; // 不能跳跃赋值,不知道的成员值可以暂时留空。
结构体变量可以整体赋值
typedef struct student
{
char sno[21];
char name[21];
int classNum;
float score;
}STU;
STU b = {"20200908","小红",2,100};
STU c; // 将b中的数据写入到c空间中去
c = b;//整体赋值将结构体b赋值给结构体c
结构体数组
是数组 ,里面存放的数据是多个结构体体。
定义格式:
结构体类型 数组名[元素个数];
typedef struct student
{
char sno[21];
char name[21];
int classNum;
float score;
}STU;
// 定义一个数组,用来存放3个同学的信息。
STU arr[3]; --- 在内存里面开空间的。
结构体数组空间进行空间读写操作
// 拷贝赋值
数组名[下标].成员名 --- 接下来看成员是什么类型决定下一步操作。
strcpy(arr[0].sno,"20200908");
strcpy(arr[0].name,"小明");
arr[0].classNum = 3;
arr[0].score = 96;
// 输入赋值
int i = 1;
for(i=1;i<3;i++)
{
printf("请输入学号:");
scanf("%s",arr[i].sno); // &a.sno[0]
printf("请输入姓名:");
scanf("%s",arr[i].name);
printf("请输入班级:");
scanf("%d",&arr[i].classNum);
printf("请输入成绩:");
scanf("%f",&arr[i].score);
}
// 输出:
for(i=0;i<3;i++)
{
printf("%s %s %d %.2f\n",arr[i].sno,arr[i].name,arr[i].classNum,arr[i].score);
}
结构体数组初始化:
typedef struct student
{
char sno[21];
char name[21];
int classNum;
float score;
}STU;
STU arr[3] = {{"20200920","小明",1,90},{"20200910","小王",3,100}};