【C语言】一篇搞定自定义类型:结构体、枚举、联合体(共用体)附上简易通讯录项目源码(二)

简介: 【C语言】一篇搞定自定义类型:结构体、枚举、联合体(共用体)附上简易通讯录项目源码(二)

2. 枚举

枚举顾名思义就是一一列举。

把可能的取值一一列举。

比如我们现实生活中:


一周的星期一到星期日是有限的7天,可以一一列举。

性别有:男、女、保密,也可以一一列举。

月份有12个月,也可以一一列举

颜色也可以一一列举。


这里就可以使用枚举了。


2.1 枚举类型的定义

enum Day//星期

{

Mon,

Tues,

Wed,

Thur,

Fri,

Sat,

Sun

};

enum Sex//性别

{

MALE,

FEMALE,

SECRET

};

enum Color//颜色

{

RED,

GREEN,

BLUE

};

以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。

{ }中的内容是枚举类型的可能取值,也叫 枚举常量 。

这些可能取值都是有值的,默认从0开始一次递增1,当然在定义的时候也可以赋初值。 例如:


2.2 枚举的优点

我们可以使用 #define 定义常量,为什么非要使用枚举? 枚举的优点:


1.增加代码的可读性可维护性

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

3.防止了命名污染(封装)

4.便于调试

5.使用方便,一次可以定义多个常量


2.3 枚举的使用

enum Color//颜色

{

RED=1,

GREEN=2,

BLUE=4

};

enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。

clr = 5; //这里需要注意,不能这样赋值,只能用可能值来赋值,这里可以用可能值1,2,4


3. 联合

3.1 联合类型的定义

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。


比如:


//联合类型的声明

union Un

{

char c;

int i;

};

//联合变量的定义

union Un un;

//计算连个变量的大小

printf("%d\n", sizeof(un));


因为共用空间,所以联合体大小至少为最大成员的大小(因为联合至少得有 能力保存最大的那个成员)


微信图片_20220415174657.png

3.2 联合的特点


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


union Un

{

int i;

char c;

};

union Un un;

// 下面输出的结果是一样的吗?

printf("%d\n", &(un.i));

printf("%d\n", &(un.c));

//下面输出的结果是什么?

un.i = 0x11223344;

un.c = 0x55;

printf("%x\n", un.i);

微信图片_20220415174726.png

图解:


微信图片_20220415174738.png

3.3 联合大小的计算


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


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


比如:


union Un1

{

char c[5];

int i;

};

union Un2

{

short c[7];

int i;

};

//下面输出的结果是什么?

printf("%d\n", sizeof(union Un1));

printf("%d\n", sizeof(union Un2));


微信图片_20220415174817.png

图解:

微信图片_20220415174827.png微信图片_20220415174838.png



版权声明:本文为CSDN博主「敲代码的布莱恩特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/DerrickWestbrook/article/details/120380553

相关文章
|
10天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
17天前
|
搜索推荐 C语言
C语言冒泡排序(附源码和动态图)
冒泡排序是一种简单的排序算法,其基本思想是通过重复遍历待排序的数列,比较每对相邻元素的值,如果它们的顺序错误(即满足一定的排序条件,如从小到大排序时前一个元素大于后一个元素),就交换它们的位置。这个过程就像水底的气泡一样逐渐向上冒,因此得名“冒泡排序”。
|
27天前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
32 7
|
26天前
|
C语言
C语言实战项目——学生试卷分数统计
C语言实战项目——学生试卷分数统计
|
27天前
|
存储 定位技术 API
C语言实战 -- 经典贪吃蛇游戏(含完整源码)
C语言实战 -- 经典贪吃蛇游戏(含完整源码)
21 1
|
13天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的C语言在线评测系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的C语言在线评测系统附带文章源码部署视频讲解等
25 0
|
17天前
|
Linux C语言
【编程小实验】C语言实现:无限循环写入文本文件,支持Ctrl+C中断与数据追加(附完整源码)
在Linux中,文件I/O(输入/输出)是程序与文件进行交互的基本方式,包括读取文件内容和向文件写入数据。这通常通过标准的C库函数来实现,下面是一些基本的文件读写操作和代码示例。
|
20天前
|
存储 SQL 网络协议
什么是PACS系统?一套C语言C/S架构PACS影像归档和通信系统源码
PACS系统是基于C/S架构的医学影像归档和通信系统,遵循IHE和DICOM3.0标准,采用Wintel平台与品牌服务器,配备SQL Server数据库,支持双机热备。它确保图像质量和高效传输,兼容多种医学设备,允许历史胶片扫描存储,并有严格的权限管理与安全机制,包括数据备份和故障恢复功能,旨在实现资源共享和效率提升。系统设计考虑了与医院HIS集成及未来扩展。
17 0
|
26天前
|
编译器 C语言 C++
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
【海贼王编程冒险 - C语言海上篇】自定义类型:结构体,枚举,联合怎样定义?如何使用?
12 0
|
26天前
|
存储 人机交互 C语言
【C语言项目实战】使用单链表实现通讯录
【C语言项目实战】使用单链表实现通讯录