本文介绍了C/C++中两个自定义类型:枚举–enum和联合体–union
主要涉及两种类型的声明,定义,使用.特点,类型大小的计算…
继上篇自定义类型:结构体 –struct

C/C++自定义类型:枚举和联合体

  • 一.枚举 –enum
    • 1.枚举类型的定义
    • 2.枚举常量取值规则
    • 3.枚举类型的使用
    • 4.枚举类型的优点
  • 二.联合体(共用体) –union
    • 1.联合体类型的声明
    • 2.联合体类型的特点
    • 3.联合体大小的计算
  • 三.枚举和联合体类型总结

一.枚举 –enum

枚举顾名思义就是:一一列举.
它是C/C++中一种自定义类型,当我们想表达有限个数据时,可以使用到枚举类型,
比如要表达性别可以是:男,女,保密
表达一周有多少天:星期一到星期天
表达特定的颜色–三原色:红绿蓝 等等
这些有限个的数据都可以一一列举.就可以使用枚举将数据作为枚举常量来表示, 当我们用数字来表示一些有意义的值时,难免会出现混淆,忘记的情况,而用枚举常量来代替这些要表达的数字,二者含义一样,但是枚举 而可以使数据更简洁,可读性高等…

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 都是枚举类型。enum为枚举类型 后面的Day为枚举标签(枚举名)类似于结构体标签.用来标识每个不同枚举,
{}中的内容是枚举类型的可能取值,也叫 枚举常量(一般是大写的标识符)
注意:枚举常量间用 ,逗号隔开,最后一个不用逗号, 最后要加上分号;

2.枚举常量取值规则

定义枚举类型后,它内部枚举常量都是些大写标识符,每个标识符都有自己的常量值,也可以在定义枚举常量时初始化一个常量值
这些可能取值都是有值的,如果没有初始化常量值默认第一个是从0开始,后面的枚举常量依次递增1,

#includeenum color{RED,GREEN,BLUE};int main(){printf("%d %d %d", RED, GREEN, BLUE);//输出结果是什么return 0;}

根据上面规则得出 不对其初始化时第一个开始默认是0后面的枚举常量依次递增1 ,结果为0 1 2

#includeenum color{RED,GREEN=66,BLUE};int main(){printf("%d %d %d", RED, GREEN, BLUE); //运行结果是什么return 0;}

根据规则第一个没初始化默认为0,而第二个枚举常量初始化为了66,第三个未初始化根据第二个初始化为66 后递增规则 第三个表达的常量值是67 运行结果为0 66 67

3.枚举类型的使用

在声明枚举类型后,可以用枚举类型定义变量,其变量取值只能是枚举常量里的其中一个,用于枚举常量赋于变量表示特定标识性的含义

#includeenum color{RED,GREEN=66,BLUE};int main(){enum color num = GREEN;    printf("%d\n",sizeof(enum color));printf("%d\n",num);num = RED;printf("%d\n", num);num = BLUE;printf("%d", num);return 0;      //输出结果是什么" />

而&(un.i)求整形变量i的空间得到起始地址–第一个内存单元地址
&(un.c)求字符变量c的空间因为c是和i共用空间用的起始地址上内存单元的空间也就是i第一个内存单元地址,所有&(un.i)和&(un.c)地址表示方式是一样的,

un.i=0x11223344表示将成员变量i里赋值一个十六进制形式的整数,而当前编译器是小端形式 内存里分布是 44 33 22 11
最低地址处的内存单元里的数据是44,此时输出un.i按小端形式取出输出结果是11223344
然后un.c=0x55表示将联合体里c成员变量赋值为0x55
而c占的空间就是i里四个内存单元地址最小的内存单元,即将44改为了55,
此时联合体里的所有成员内存分布为55 33 22 11
按十六进制形式输出 结果为11223355


3.联合体大小的计算

1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

对齐数概念在这篇介绍结构体类型博客中介绍到->对齐数

#includeunion Un1{char c[5];int i;};union Un2{short c[7];int i;};int main(){//下面输出的结果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;}

union Un1中最大成员大小是char c[5]共五个内存单元 ,联合体成员总大小最小要是5
而char c[5]对齐数是char类型大小和默认对齐数8取较小的为1字节,而int i对齐数则是4字节, 5不是4的倍数要对齐到4的倍数最后总大小为8

union Un2中最大成员大小是short c[7]共2*7为14个内存单元,联合体成员总大小最小要是14,而short c[7]每个元素是short类型 对齐数是short 类型2字节对齐数是2,而int i对齐数是4字节,4不是14的倍数要对齐到4的倍数最后大小为16

三.枚举和联合体类型总结

本文介绍了两种c/c++中的自定义类型:枚举和联合体,继上篇->结构体类型 三种自定义类型已全部介绍
主要以认识,熟悉为主,在学的更深入之后,才会真正体会到设计这些自定义类型的好处…