一.结构体此处输入字符时,需要注意:输入一个名字,定义一个数组,输入一组名字,定义一个二维数组,输入多组名字,需要定义三维数组一个名字:张三 name[20]一组名字:{张三,李四,王五} name[4][20]多组名字:{{张三,李四,王五},{朱六,钱七}} name[2][3][20]1.概念1.通过结构体,可以把不同类型的数据组合在一起,表示一个逻辑上紧密相关的实体,不实用,管理起来就会繁琐//定义结构体struct Student{int age;int name;int id;};//定义结构体变量student1struct Student student1;()//初始化结构体成员strcpy(person1.name,Alice);student1.age 20;(使用.进行访问)//打印成员printf(Name:%d/s,person1.name);struct Student{int age;int name;int id;}student1,student2;typedef:可以为结构体类型定义别名,从而简化后续的变量声明;typedef struct{int id;char name[50]}Student;Student student1;//使用别名Student来声明变量typedef longlong ll;ll a;struct结构体名{数据类型 成员名数据类型 成员名};2.结构体数组可以定义结构体数组,用于存储多个想通类型的结构体变量struct Person people[3];使用结构体数组遍历结构体数组并访问每个结构体成员for(int i;i3;i){printf(Person %d Name:%s/n,i1,people[i].name);}3.结构体指针使用指针指向结构体变量struct Point *ptr p;指向Point结构体的指针变量ptr并将其指向结构体变量p的地址。struct Person *ptr*person1;ptr-person[0]ptr1-person[1]*p person(p1)-age通过指针访问结构体成员-访问printf(Name:%s\n,ptr-name);通过指针遍历结构体数组:struct Student *ptr students;for(int i0;i3;i){printf(Name:%s\n,(ptri)-name);}例如:#includestdio.h struct Node{ int data; struct Node* next;//链表形式关联 }; struct Node*head;//定义一个指向Node结构体的指针 //不能直接用,这是野指针,没有指向某个地址 int main(){ //需要分配一个地址空间 head (struct Node*)malloc(sizeof(struct Node)); 强制转换 多大啊 //(例如:*ptr (int*)arr)arr为arr[0] head -data 1; return 0; }4.嵌套:struct Date{int day;int year;}struct student{int name[50]struct Date brithday;(嵌套的结构体)}}struct student student1;student1.birthday.day6;(嵌套用两个点)5.无名称struct{int x;int y;}point {10,20};初始化一个匿名结果体变量使用:printf(%d\n,point.x);6.uart配置结构体二.联合体1.联合体的语法:声明语法:union union_name{data_type1 member1;data_type2 member2;}内存共享:联合体中所有成员共享同一内存,联合体大小取决于其最大成员的大小改了member1 也就是改了member22.union Date{int i; 4个字节float f; 4个字节char str[20]; 20个字节}2.应用:1.节省空间一个设备驱动器需要存储不同类型的传感器,如温度,湿度,压力,但在同一时刻只需要存储其中的一个值,使用联合体就可以节省空间union SensorDate{int temperature;float humidity;double pressure;}只分配一个不用分配三个2.数据类型转换修改一个成员会影响其他成员,可将同一块内存以不同类型的视角进行访问,底层变成常用#include stdio.h union{ float f; unsigned int i; }floatTolnt; int main(){ floatTolnt.f 3.14; printf(The binary representation of 3.14 is:%x/n,floatTolnt.i); return 0; }float 和unsigned共享成员,因此可以通过unsigned int成员查看float的二进制3.协议解析网络编程中,从接收到的字节流中提取多种数据类型,在处理字节流时,联合体可以将字节数组解释为特定的数据类型#include stdio.h union Packet{ unsigned char bytes[4]; int number; } int main(){ union Packet p;//定义联合体变量p p.bytes[0]0x01;//赋值 p.bytes[1]0x02; p.bytes[2]0x03; p.bytes[3]0x04; printf(Integer respessentation:%d\n,p.number);//用整型的变量同一输出出去 return 0; //因为联合体,改变了一个另外一个也改变了,占的是同一个位置 //多字节拆分处理 }4.变长数据处理struct Message{int command;union{int intValue;float floatValue;char str[20];}data;};不同的command值对应的int float或字符串类型的数据来调用5.联合体和枚举结合使用区分联合体当前存储的具体数据类型.通过枚举可以确定当前应该解释联合体中的哪个成员6.硬件寄存器三.枚举1.#define Monday 1const int Monday 1枚举:允许将一组相关的整数常量定义在一起,增加代码的可读性和管理性,通过名字定义一组数字值使用场景:有限的离散的状态或者选项,月份,周天数,方向2.类型的定义:enum Weekday{sunday; //0monday //1tuesday; //2};关键点:enum枚举中的每一个标识符代表一个整数常量,默认情况下,第一个标识符的值为0,后续自动递增,可以为某个标识符显示赋值, 未赋值的标识符会自动递增3.使用枚举怎么用?把enum中的值看成一个数, 要输入的就是:sensor_type然后把输入的sensor_type 与enum中的值进行对比,根据这个条件来展示联合体中的哪个成员​ #include stdio.h enum SensorType{ TEMPERATURE,HUMIDITY,PRESSURE }; union SensorData{ float temperature; int humidity; float pressure; }; int main(){ enum SensorType sensor_type; union SensorData sensorData; printf(输入sensor_type:); scanf(%d,sensor_type); switch(sensor_type){ case TEMPERATURE: printf(输入传入的TEMPERATURE传感器值:); scanf(%f,sensorData.temperature); printf(temperature:%.2f\n,sensorData.temperature); break; case HUMIDITY: printf(输入传入的HUMIDITY传感器值:); scanf(%d,sensorData.humidity); printf(humidity:%d\n,sensorData.humidity); break; case PRESSURE: printf(输入传入的PRESSURE传感器值:); scanf(%f,sensorData.pressure); printf(pressure:%.2f\n,sensorData.pressure); break; } } ​