C语言笔记(五)

张开发
2026/4/12 16:52:07 15 分钟阅读

分享文章

C语言笔记(五)
目录结构体结构体变量结构体数组结构体与指针结构体中的嵌套联合体联合体的应用枚举变量枚举使用枚举常量的默认值与自定义值枚举在条件语句的使用枚举和常量定义的比较结构体为何需要通过结构体可以把不同类型的数据组合在一起表示一个逻辑上紧密相关的实体。如果不使用结构体管理这些数据会非常繁琐。语法格式struct 结构体名{数据类型 成员名;数据类型 成员名1;//其他成员};结构体变量定义结构类型后可通过struct Person person1定义结构体变量可用“.”运算符访问结构体成员结构体数组定义struct Person people[3]用于存储多个相同类型的结构体变量结构体与指针使用指针指向结构体变量struct Person *ptr person1;使用指针访问结构体成员printf(Name%s\n,ptr -name);printf(Age:%d\n,ptr-age);通过指针遍历结构体数组struct Student *ptr students; for (int i 0;i 3;i){ printf(Name%s\n,(ptri)-name); }结构体中的嵌套结构体中的结构体可以在结构体中嵌套另一个结构体struct Date{ int day; int month; int year; }; struct Student{ char name[50]; struct Date birthday; };访问嵌套结构体可以通过。访问其成员student1.birthday.day 15; student1.birthday.month 6; student1.birthday.year 1995;联合体语法union 联合体名{数据种类 成员;数据种类 成员2;...};内存布局内存共享联合体中所有成员共享同一内存其大小取决于最大成员大小。内存对齐与大小计算union Data data;printf(Size of union%ld\n,sizeof(data));//输出联合体大小联合体的应用1.节省内存联合体的主要用途之一是节省内存。在需要存储不同类型的数据但同一时刻只需要存储其中一种时使用联合体可以极大减少内存的浪费。2.数据类型转换联合体常用于类型转换。由于联合体中的所有成员共享相同的内存修改其中一个成员会影响其他成员。通过这种特性可以方便地将同一块内存以不同类型的视角进行访问这在底层编程中非常有用。3.协议解析在网络编程或通信协议中经常会需要从接收到的字节流中提取多种数据类型。在处理这些字节流时联合体可以帮助程序员方便地将字节数组解释为特定的数据类型。4.变长数据处理当需要处理变长数据时例如某个消息可能包含不同长度的字段联合体可以帮助动态选择处理的数据类型。5.联合体和枚举的结合使用联合体常与枚举enum一起使用以区分联合体中当前存储的具体数据类型。通过枚举可以确定当前应该解释联合体中的哪个成员。6.硬件寄存器访问在嵌入式编程中访问硬件寄存器时通常需要同时以不同的位段形式访问寄存器中的不同字段。联合体可以帮助方便地将寄存器的二进制位段拆解为可访问的结构。枚举变量C语言中一种用户定义的类型允许将一组相关的整数常量定义在一起增加代码的可读性和管理性。它通过名字定义一组整数值以帮助程序员更加清晰地表示逻辑状态和选项。适用场景当程序中有一组有限的、离散的状态或选项时使用枚举比直接使用整数更加明确。定义enum Weekday {Sunday,//默认值为0Monday,// 1Tuesday,// 2Wednesday,// 3Thursday,// 4Friday,// 5Saturday// 6};关键点enum用于定义枚举类型枚举中的每个标识符代表一个整数常量默认情况下第一个标识符的值为0后续的值自动递增。可以为某个标识符显式赋值未赋值的标识符会自动递增。枚举使用#includestdio.h enum Day{ SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }; int main(){ enum Day today; today MONDAY; if(today MONDAY){ printf(Its Monday!\n); } return 0; }枚举常量的默认值与自定义值•如果不指定枚举常量的值默认从0开始递增。•可以为某些枚举常量手动指定值之后的常量会根据指定值继续递增。enum Day {SUNDAY 7,MONDAY,//此值为8TUESDAY 10,//定义了为10WEDNESDAY//此值为10};枚举在条件语句的使用#includestdio.h enum Day{ SUNDAY,MONDAY TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY }; int main(){ enum Day today FRIDAY; switch(today){ case SUNDAY: printf(周日\n); break; case MONDAY: printf(周一\n); break; case TUESDAYDAY: printf(周二\n); break; case WEDNESDAY: printf(周三\n); break; case THURSDAY: printf(周四\n); break; case FRIDAY: printf(周五\n); break; default: printf(另外一天); } return 0; }枚举和常量定义的比较常量定义可以使用#define或const定义常量但这些常量是独立的缺乏内在联系。枚举一组相关的常量集合成一个类型具有明确的范围和递增机制。#define SUNDAY 0#define MONDAY 1#define TUESDAY 2//使用枚举enum Day {SUNDAY, MONDAY, TUESDAY};C标准并没有严格定义枚举的底层类型但通常会分配为int类型。在某些编译器中可以通过编译选项来指定枚举使用更小的类型如char或short以节省内存。

更多文章