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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: c语言进阶部分详解(详细解析自定义类型——枚举,联合(共用体))

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



一.枚举

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

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个字节  对齐数是1
  int a;  //4个字节   对齐数是4
};
int main()
{
  printf("%d", sizeof(union U1));//如果只是最大的成员变量的大小,那应当输出5
  return 0;
}

但结果是8



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

 

目录
相关文章
|
26天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
104 60
|
29天前
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
24 3
|
1月前
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
31 4
|
1月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
存储
atoi函数解析以及自定义类型经典练习题
atoi函数解析以及自定义类型经典练习题
40 0
|
1月前
|
存储 编译器 Linux
C语言——自定义类型
C语言——自定义类型
|
1月前
|
存储 安全 编译器
深入理解C语言中的枚举
深入理解C语言中的枚举
|
1月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
|
1月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
3月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
46 1
下一篇
无影云桌面