尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C语言:自定义类型:联合体与枚举

C语言:自定义类型:联合体与枚举 文章目录前言1. 联合体1.1 联合体类型的声明1.2 联合体类型的特点1.3 联合体大小的计算1.4 用联合判断大小端2. 枚举2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用前言在C语言中除了基本数据类型如int、char、float和数组程序员还可以通过结构体、联合体和枚举来自定义复杂的数据类型。这些自定义类型极大地增强了C语言描述现实世界数据的能力。本文将重点介绍联合体和枚举这两种自定义类型。联合体以其独特的内存共享机制在节省内存和灵活解释数据方面发挥着重要作用而枚举则为程序中的整型常量提供了更具可读性和安全性的表示方式。理解并掌握它们是迈向高级C语言编程的关键一步。1. 联合体联合体是C语言中一种特殊的数据类型它允许在同一块内存空间中存储不同类型的数据成员。与结构体为每个成员分配独立内存不同联合体的所有成员共享同一段内存。这意味着在任意时刻联合体中只有一个成员是有效的对其中一个成员的赋值会覆盖其他成员的值。1.1 联合体类型的声明声明一个联合体类型使用关键字union其语法与结构体struct非常相似union联合体标签{成员类型1成员名1;成员类型2成员名2;// ... 更多成员};union声明联合体类型的关键字。联合体标签联合体类型的名称遵循C语言标识符命名规则。成员列表用花括号{}包裹内部定义了联合体的各个成员每个成员都有自己的类型和名称。示例声明一个简单的联合体#includestdio.h// 联合类型的声明unionUn{charc;inti;};intmain(){// 联合变量的定义unionUn un{0};// 计算联合变量的大小printf(%d\n,sizeof(un));//输出4return0;}1.2 联合体类型的特点联合体最核心的特点在于其内存共享机制这带来了以下几个关键特性所有成员共享同一内存地址联合体的所有成员都从同一内存地址开始存储。这意味着通过不同的成员名访问的是同一块内存区域。同一时间只有一个成员有效由于内存共享当你给一个成员赋值后再访问其他成员将得到未定义的值可能是之前值的残留也可能是被覆盖后的新值。程序员需要自己记录当前哪个成员是“活跃”的。大小由最大成员决定联合体变量占用的内存大小等于其所有成员中所需空间最大的那个成员的大小。编译器会确保联合体的大小至少能容纳下最大的成员并可能进行内存对齐。1.3 联合体大小的计算计算联合体的大小需要遵循两个原则大小至少等于其最大成员的大小。大小必须是所有成员类型对齐要求的整数倍内存对齐原则。计算步骤找出所有成员中占用空间最大的成员的大小sizeof(最大成员)。找出所有成员中对齐要求最严格的成员的对齐值通常等于其大小。最终联合体的大小是最大成员大小向上取整到最严格对齐值的整数倍。unionExample{charc;// 大小1字节对齐要求1字节inti;// 大小4字节对齐要求4字节在常见32/64位系统上doubled;// 大小8字节对齐要求8字节};最大成员是double d大小为8字节。最严格的对齐要求也是double的8字节。因此union Example的大小为8字节。可以使用sizeof运算符验证printf(Size of union Example: %zu bytes\n,sizeof(unionExample));// 输出 8与结构体大小对比structSExample{charc;inti;doubled;};// 在考虑对齐如按8字节对齐后此结构体大小可能为 1(3填充)4(4填充)8 24字节。可以看到联合体通过共享内存在存储“互斥”数据时能比结构体节省大量空间。1.4 用联合判断大小端我们可以写一个程序判断当前机器是大端还是小端。int check_sys() { union { int i; char c; }un; un.i 1; return un.c;//返回1是小端返回0是大端 }2. 枚举枚举是C语言中一种用于定义一组命名整型常量的自定义数据类型。2.1 枚举类型的声明声明一个枚举类型使用关键字enum其基本语法如下enum枚举标签{枚举常量1,枚举常量2,// ... 更多常量};enum声明枚举类型的关键字。枚举标签枚举类型的名称遵循C语言标识符命名规则。枚举常量列表用花括号{}包裹内部列出所有枚举常量常量之间用逗号分隔。示例声明一个表示星期的枚举类型enumWeekday{MONDAY,// 默认值为 0TUESDAY,// 默认值为 1WEDNESDAY,// 默认值为 2THURSDAY,// 默认值为 3FRIDAY,// 默认值为 4SATURDAY,// 默认值为 5SUNDAY// 默认值为 6};枚举常量的值默认情况下第一个枚举常量的值为0后续常量依次递增1。可以显式地为枚举常量指定整数值未指定的常量将基于前一个值递增1。enum Color { RED 1, GREEN, // 值为 2 BLUE 5, YELLOW // 值为 6 };2.2 枚举类型的优点我们可以使用#define定义常量为什么非要使用枚举相比#define枚举具有以下显著优点增加代码的可读性和可维护性枚举常量使用有意义的名称使代码意图一目了然。同时枚举常量集中定义在一处便于统一管理和修改。和#define定义的标识符比较枚举有类型检查更加严谨便于调试预处理阶段会删除#define定义的符号使用方便一次可以定义多个常量枚举常量是遵循作用域规则的枚举声明在函数内只能在函数内使用。2.3 枚举类型的使用enumColor//颜色{RED1,GREEN2,BLUE4};enumColorclrGREEN;//使用枚举常量给枚举变量赋值在C语言中可以直接用整数给枚举变量赋值但是在C是不行的C的类型检查比较严格。
返回列表