自定义类型:联合和枚举

简介: 自定义类型:联合和枚举

联合体

联合体的特点所有成员共用同一块内存空间。所以联合体也叫共用体

联合体类型的声明

union Un
{
  int i;
  char ch;
};
 
int main()
{
  union Un p = { 0 };     //联合变量的定义
  printf("%zd\n", sizeof(p)); //计算联合变量的大小
  return 0;
}

注:联合体也类似结构体,结构体中的struct必不可少,同理,联合体中的union必不可少

联合变量的大小

控制台输出:4

为什么呢?我们再来观察联合体中 i 和 ch 的地址

union Un
{
  int i;
  char ch;
};
 
int main()
{
  union Un p = { 0 };     //联合变量的定义
  printf("%zd\n", sizeof(p)); //计算联合变量的大小
  printf("%p\n", &p.i);
  printf("%p\n", &p.ch);
  return 0;
}

控制台输出:

代码结果解释

那还有疑问,为什么这两个的地址要这样做存放呢?

这得谈及我们上面👆说到的联合体的特点;

这里我们具体再说一下联合体的特点

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


联合体和结构体的对比



联合体的作用


最大作用就是可以节省空间

举个栗子:

价格:price ;类型:type ;大小:size ;标签:label ;颜色:colour

我们可以这样子用联合体:

struct study_set
{
  //公共
  int price;
  char type;
 
  //特殊
  union
  {
    struct
    {
      char colour;  //颜色
    }pencil_book;     //笔盒
 
    struct
    {
      char label;    //标签
    }book;         //书本
 
    struct
    {
      int size;      //大小
    }book_shelf;       //书架
  }item;
};

枚举类型

枚举 -- 把可能的取值一一列举

一个星期有七天--1,2...7;

一年有12个月份--1,2...12


例如一周的天数

注:枚举也像结构体,联合体一样有关键字,枚举的关键字是enum

#include<stdio.h>
//一周的天数
enum Day
{
  Mon,
  Tues,
  Wed,
  Thur,
  Fri,
  Sat,
  Sun
};
 
int main()
{
  printf("%d\n", Mon);
  printf("%d\n", Tues);
  printf("%d\n", Wed);
  //...
  printf("\n");
  printf("%d\n", Sun);
 
  return 0;
}

来看看这段代码输出什么?

以上是编译器设置的最初始默认值,也可以自己设置

#include<stdio.h>
//一周的天数
enum Day
{
  Mon=1,
  Tues=9,
  Wed=10,
  Thur,
  Fri,
  Sat,
  Sun
};
 
int main()
{
  printf("%d\n", Mon);
  printf("%d\n", Tues);
  printf("%d\n", Wed);
  //...
  printf("\n");
  printf("%d\n", Sun);
 
  return 0;
}

控制台输出:1 9 10  14

枚举类型优点

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

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

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

4. 使用方便,⼀次可以定义多个常量

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


目录
相关文章
|
11月前
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
294 3
|
11月前
|
存储 安全 开发工具
基于ESP32的便携式游戏机
基于ESP32的便携式游戏机
251 2
|
11月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
198 1
|
11月前
|
C语言
大学生期末C语言实验(学生成绩和鞍点)
大学生期末C语言实验(学生成绩和鞍点)
407 0
大学生期末C语言实验(学生成绩和鞍点)
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之数据库处于只读状态,如何恢复其读写功能
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之数据库处于只读状态,如何恢复其读写功能
|
11月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
125 0
|
11月前
|
网络协议 大数据 网络架构
桥接模式和NET模式的区别
桥接模式和NET模式的区别
452 0
|
11月前
|
Python
【python从入门到精通】-- 第一战:安装python
【python从入门到精通】-- 第一战:安装python
112 0
|
存储 算法 安全
一文带你学习“国密算法”
一文带你学习“国密算法”
1766 3
一文带你学习“国密算法”
|
存储 关系型数据库 对象存储
PolarDB-PG | PostgreSQL + 阿里云OSS 实现高效低价的海量数据冷热存储分离
数据库里的历史数据越来越多, 占用空间大, 备份慢, 恢复慢, 查询少但是很费钱, 迁移慢 怎么办? 冷热分离方案: - 使用PostgreSQL 或者 PolarDB-PG 存成parquet文件格式, 放到aliyun OSS存储里面. 使用duckdb_fdw对parquet文件进行查询. - duckdb 存储元数据(parquet 映射) 方案特点: - 内网oss不收取网络费用, 只收取存储费用, 非常便宜 - oss分几个档, 可以根据性能需求选择 - parquet为列存储, 一般历史数据的分析需求多,性能不错 - duckdb 支持 parquet下推过滤, 数据过滤性能不错
7587 6
PolarDB-PG | PostgreSQL + 阿里云OSS 实现高效低价的海量数据冷热存储分离