当前位置: 首页 > news >正文

c语言进阶部分详解(详细解析自定义类型——枚举,联合(共用体))

上篇文章介绍了结构体相关的内容,大家可以点击链接进行浏览:c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)-CSDN博客

各种源码大家可以去我的gitee主页进行查找:唔姆 (Nerowlp) - Gitee.com

今天要介绍的是:枚举与联合的相关内容


目录

一.枚举

1.枚举类型的定义 

 2.枚举的优点

3.枚举的使用

二.联合(共用体) 

1.联合类型的定义 

2.联合的特点

应用:判断当前计算机的大小端存储 

3.联合大小的计算


一.枚举

  • 枚举顾名思义就是一一列举
  • 把可能的取值一一列举

1.枚举类型的定义 

enum Sex//性别
{MALE,FEMALE,SECRET
};
enum Color//颜色
{RED,GREEN,BLUE
};
上述代码定义的 enum Sex enum Color 都是枚举类型。
{  } 中的内容是枚举类型的可能取值,也叫 枚举常量  
  • 这些可能取值都是有值的,默认从 0 开始,一次递增 1 ,当然在定义的时候也可以赋初值
enum Sex
{MALE,FEMALE,SECRET
};int main()
{printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);return 0;
}

默认值便是从零开始: 

 

也可以自己进行主动赋值:

 

大家也可以猜一下这段代码输出什么:

enum Sex
{MALE,FEMALE=8,SECRET
};int main()
{printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);return 0;
}

答案揭晓:

 

 

 2.枚举的优点

  1. 增加代码的可读性和可维护性
  2. #define定义的标识符比较枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

 

3.枚举的使用

enum Color//颜色
{RED=3,GREEN=2,BLUE=4
};
enum Color cl = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异

二.联合(共用体) 

1.联合类型的定义 

联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
union A //定义一个共用体
{char a;int b;
};int main()
{union A a; //创建一个共用体变量printf("%p\n", &a);printf("%p\n", &(a.a));printf("%p\n", &(a.b));return 0;
}

可以看到三个地址是一样的: 

 

 

2.联合的特点

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

应用:判断当前计算机的大小端存储 

union A //定义一个共用体
{char a;int b;
};
int judge()
{union A u;u.b = 1;return u.a;
}int main()
{int a = judge();if (a == 1){printf("是小端");}else{printf("是大端");}return 0;
}

众所周知vs2019 是小端储存: 

 

 

 

3.联合大小的计算

  • 联合的大小至少是最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
union U1
{char arr[5]; //5个字节  对齐数是1int a;  //4个字节   对齐数是4
};
int main()
{printf("%d", sizeof(union U1));//如果只是最大的成员变量的大小,那应当输出5return 0;
}

但结果是


 好啦,这次枚举,联合(共用体)就讲解到这里。下一次会继续记录我学习的过程。希望能对大家有所帮助。

 

 

 

 

 

 

 

 

 

 

 

 

 

http://www.lryc.cn/news/204416.html

相关文章:

  • 使用 Requests 库和 PHP 的下载
  • ConcurrentHashMap底层具体实现知道吗?实现原理是什么
  • Go语言“Go语言:掌握未来编程的利器“
  • 达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”
  • TensorFlow2从磁盘读取图片数据集的示例(tf.keras.utils.image_dataset_from_directory)
  • Unity开发过程中的一些小知识点
  • 大语言模型(LLM)综述(一):大语言模型介绍
  • 在Ubuntu上安装和挂载NFS
  • Python 实现的简易数据库管理系统 (DBMS)
  • 1.初识MySQL
  • 【列存储学习总结】
  • 小记java正则表达式中matcher.find() 和 matcher.matches() 的区别
  • 当中国走进全球化的“深水区”,亚马逊云科技解码云时代的中国式跃升
  • 零基础Linux_21(多线程)页表详解+轻量级进程+pthread_create
  • nodejs+wasm+rust debug及性能分析
  • IP证书针对公网IP签发
  • SpringBoot-集成Minio
  • 【ML】cheatsheet
  • 【字符串】【将字符数组转为字符串】Leetcode 122 路径加密
  • 网络基础知识100问
  • 女孩子就是要打扮漂亮,让童年不留遗憾
  • 实现目录数据的上移(up)、下移(down)、置顶(top)、置底(bottom)的操作
  • Ubuntu 常用命令
  • 如何空手套白狼?一口气省7K再抓住一个7K起步的工作?
  • 电脑主机如何选择内存条
  • 计算机考研自命题(5)
  • 【原创】c语言4种字符串函数的代码测试
  • 扩散模型学习——代码学习
  • redis 数据结构
  • node.js中express框架cookie-parser包设置cookie的问题