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

1、联合体类型的声明

2、联合体的特点

3、联合体大小的计算

4、枚举类型的声明

5、枚举类型的优点

6、枚举类型的使用

联合体类型的声明

像结构体一样,联合体也是由一个或多个成员构成,这些成员可以是不同的类型。联合体的关键词是union,但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间,所以联合体也叫:共用体。

给联合体其中一个成员赋值,其他成员的值也跟着变化

union U

{

char c;

int i;

};

int main()

{

union U u = { 0 };

printf("&u=%p\n", &u);

printf("&u.i=%p\n", &(u.i));

pritf("&u.c=%p\n", &(u.c));

}

这一串代码打印出来的地址是一样的

联合体的特点

联合体的成员是共用同一块内存空间的,这样一个联合体变量的大小(因为联合体至少得有能力保存最大的那个成员)

联合体大小的计算

联合体的大小至少是最大成员的大小

当最大成员的大小不是最大的对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

下面这两个例子可以很好的说明:

union U

{

char arrr5; //5

int n; //4

};

int main()

{

printf("%zu\n", sizeof(union U));

//打印结果为 8

return 0;

}

union U

{

short arrr7; // 14

int n; //4

};

int main()

{

printf("%zu\n", sizeof(union U));

//打印结果为 16

return 0;

}

使用联合体是可以节省空间的;

因为很多时候:我们只需要用其中一个变量,不需要同时用!

比如:

  • 要么存整数
  • 要么存字符
  • 要么存浮点数

不同时用 → 共用空间 → 省空间!

复制代码
内存空间:[ ][ ][ ][ ]   一共 4 字节

int a      占满这 4 字节
char b     只用第 1 字节
float c    占满这 4 字节

✅ 同一时间只能用一个✅ 放了 a 就不能放 b✅ 放了 b 就会覆盖 a

最直观对比

  • 结构体:各用各的 → 空间大
  • 联合体 :共用空间 → 空间小 = 最大成员大小

枚举类型的优点

我们可以使用#define定义常量,为什么还需要枚举:

枚举的优点:

1、增加代码的可读性和可维护性

2、和#define定义的标识符比较枚举有类型检查,更加严谨

3、便于调试,预处理阶段会删除#define定义的符号

4、使用方便,一次可以定义多个常量

5、枚举常量是遵循作用域规则的,枚举声明在函数内部,只能在函数内使用

// 定义枚举:一周的星期

// 枚举的本质:给固定的整数 起 有意义的名字

enum Week

{

// 特点1:自动赋值,默认从 0 开始,依次 +1

MONDAY, // 0

TUESDAY, // 1

WEDNESDAY, // 2

THURSDAY, // 3

FRIDAY, // 4

SATURDAY, // 5

SUNDAY // 6

};

int main()

{

// 定义枚举变量

enum Week today = FRIDAY;

printf("今天是星期:%d\n", today);

// 输出:4 (因为FRIDAY自动赋值为4)

return 0;

}

相关推荐
const_qiu4 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO4 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析
大文说跨境4 小时前
亚马逊多账号管理浏览器怎么选?云登/紫鸟/AdsPower 对比
java·前端·自动化
CoderYanger4 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
估值探索者5 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
顽疲5 小时前
java springboot vue 养老系统源码详解:请假 care_leave 销假与床位停费日扣实践
java·vue.js·spring boot
XIAEE5 小时前
一个即时通讯项目是怎么长出来的:(Spring Boot 3 + Vue 3 微前端 + 悟空 IM + LiveKit)
java·spring
n87655 小时前
Playwright Java WEB UI 自动化实现框架与逻辑
java·前端·ui
Java_AI工程师5 小时前
Spring4 / SpringBoot1.x 老项目想接入 AI?不用升级框架!3 套无痛落地方案
java·人工智能·spring boot