当前位置:网站首页>枚举和联合(自定义类型)-C语言
枚举和联合(自定义类型)-C语言
2022-08-04 05:31:00 【crazy__xieyi】
结构体内存对齐-C语言_crazy__xieyi的博客-CSDN博客
结构体传参-C语言_crazy__xieyi的博客-CSDN博客
在上两篇文章介绍到了结构体的自定因类型,下面咱们继续介绍枚举和联合自定义类型。
1.枚举类型的定义
2.枚举的优点
3.枚举的使用
4.联合类型的定义
5.联合的特点
6.联合大小的计算
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,当然在定义的时候也可以赋初值。
例如:
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
2 枚举的优点
我们可以使用#define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
3 枚举的使用
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN; //只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5; // 这种赋值不可,因为此时clr 为 enum Color类型。
4 联合类型的定义
联合也是一种特殊的自定义类型。这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
比如:
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un));
5 联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)。
union Un
{
int a;
char c;
};int main()
{
union Un u;
printf("%d\n", sizeof(un));
// 下面输出的结果是一样的吗?
printf("%p\n", &u);
printf("%p\n", &(u.a));
printf("%p\n", &(u.c));return 0;
}

所以能够证明成员是共用空间的。
利用这个特性,咱们可以编写一个代码,可以判断出咱们当前的计算机的大小端储存。
关于什么是大小端储存,请参考深度剖析数据在内存中的存储_crazy__xieyi的博客-CSDN博客
判断当前计算机的大小端存储
//int check_sys()
//{
// int a = 1;
// return *(char*)&a; //第一种解法
//}
int check_sys()
{
union
{
char c;
int i; //利用联合的特性,为第二中解法
}u;
u.i = 1;
//返回1是小端,返回0是大端
return u.c;
}
int main()
{
int a = 1;//0x 00 00 00 01
低-------> 高
//01 00 00 00 -- 小端
//00 00 00 01 -- 大端
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}6 联合大小的计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
内存对齐详看这篇文章:
结构体内存对齐-C语言_crazy__xieyi的博客-CSDN博客
比如:
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1)); // 8
printf("%d\n", sizeof(union Un2)); // 16
边栏推荐
猜你喜欢

Tencent and NetEase have taken action one after another. What is the metaverse that is so popular that it is out of the circle?

腾讯、网易纷纷出手,火到出圈的元宇宙到底是个啥?

Pytest常用插件

Fabric v1.1 环境搭建

基于asp.net的法律援助平台的设计与实现(附项目链接)

Design and implementation of legal aid platform based on asp.net (with project link)

彻底删除MySQL教程

浅谈外挂常识和如何防御

Golang environment variable settings (2)--GOMODULE & GOPROXY

makefile基础学习
随机推荐
深度学习理论——过拟合、欠拟合、正则化、优化器
sbl_init.asm-适合在编辑模式下看
LeetCode_Nov_2nd_Week
Tensorflow/Pytorch安装(Anaconda环境下,无版本冲突,亲测有效)
[日常办公][杂项][vscode]tab space
数据库的简述与常用操作指南
[Development miscellaneous][Debug]debug into kernel
管道重定向
[日常办公][ssh]cheatsheet
MNIST手写数字识别 —— 图像分析法实现二分类
LeetCode_22_Apr_4th_Week
Implementation of CAS lock-free queue
线性表之动态数组(ArrayList)的自实现
结构体传参-C语言
Pytest common plug-in
IEEE802.X protocol suite
Amazon Cloud Technology Build On-Amazon Neptune's Knowledge Graph-Based Recommendation Model Building Experience
LeetCode_Dec_2nd_Week
LeetCode_Nov_3rd_Week
Tencent and NetEase have taken action one after another. What is the metaverse that is so popular that it is out of the circle?