自定义类型:联合和枚举

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

联合体

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

联合体类型的声明

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. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使用


目录
相关文章
|
3月前
|
Linux C语言 C++
自定义类型——结构体、枚举和联合
自定义类型——结构体、枚举和联合
|
存储 编译器 Linux
自定义类型——结构体,枚举,联合
自定义类型——结构体,枚举,联合
|
编译器 C++
【学习笔记之我要C】自定义类型详解(结构体+枚举+联合)
【学习笔记之我要C】自定义类型详解(结构体+枚举+联合)
296 0
|
11月前
|
编译器 C++
自定义类型:结构体,枚举,联合 (1)
自定义类型:结构体,枚举,联合 (1)
67 1
|
11月前
|
编译器 C++
自定义类型:结构体,枚举,联合
自定义类型:结构体,枚举,联合
|
11月前
|
存储 编译器 C++
自定义类型:结构体,枚举,联合 (2)
自定义类型:结构体,枚举,联合 (2)
59 0
|
11月前
|
存储 安全 编译器
自定义类型:结构体,枚举,联合
自定义类型:结构体,枚举,联合
109 0
|
编译器 C++
自定义类型:结构体、枚举、联合
自定义类型:结构体、枚举、联合
56 0
自定义类型:结构体、枚举、联合
|
存储 C语言
详解自定义类型:结构体,枚举,联合(下)
详解自定义类型:结构体,枚举,联合(下)
|
编译器 Linux C++
详解自定义类型:结构体,枚举,联合(上)
详解自定义类型:结构体,枚举,联合(上)