C语言自定义类型联合体和枚举

本文详细介绍了C/C++中的联合体和枚举,包括它们的定义、声明方式、存储形式、使用方法以及优点,强调了联合体在节省内存和枚举在提高代码可读性和可维护性方面的应用。
摘要由CSDN通过智能技术生成

union

n.工会;联邦,联盟;协会,俱乐部;联合,合并;

结婚,婚姻;美利坚合众国(the Union);

(数)并,并集;联管节,接头;(印度次大陆)村落联合体;

<英,史>教区联合济贫组织;旗帜上象征国家统一的部分;混纺织物

enumerate

v.列举;枚举;计算

stock

n.库存,存货;股票,股份;原料;

v.备有,存有;摆满,供应;为(枪等火器)装枪托;出新芽

adj.老一套的,陈腐的;(商店)库存的,常备的;(有关)电影资料镜头的

1.联合体

定义

联合体又称共用体,和结构体类似作用都是将不同类型的变量进行集成,从而得到一个新的类型变量,不同的地方就在存储方式上,结构体是为所有类型数据都分配空间,而联合体所有类型数据共用一块空间,且空间的大小为这些类型中所占空间最大类型的大小。

声明方式

union  union_name
{
    number_var;
    number_var;
    ...
};
  • union                   创建联合体类型时的关键字        
  • union_name        union_name联合体类型的名字
  • number_var         number_varible联合体内的成员变量

 注意:

  1. 联合体类型的成员变量不能被初始化
  2. union union_name这两个合在一起才被称为联合体类型。
  3. 联合体的声明一定在使用前进行声明不能在后声明。
  4. 联合体是成员变量共用一块空间,成员变量的值就会随着其他成员的改变而改变。

例子:

typedef重命名

typedef union S //定义的联合体前加上typedef关键字
{
    char a;
    int b;
}S;//在定义完后面加上重新命名的名字
struct Stu S1;//使用struct定义的名字创建变量
Stu S2;//使用typedef重命名的名字创建变量
//不在声明时重命名
typedef union S S;//typedef关键字+原名+新名字;

特殊声明:

struct    //不声明结构体类型名字
{
    char a;
    int b;
}S1;//创建结构体变量
  • 这种在声联合体时不声明联合体类型名,而在声明后接着创建联合体变量的操作就称为联合体的匿名声明。
  • 对于这种没有将联合体类型名的联合体,就意味着不能通过联合体类型来创建联合体变量,这种只能使用它后面的联合体变量,可以称为一次性联合体。

变量创建

A.在声明时

B.通过结构体类型

存储形式

        联合体是所有成员变量共用同一块空间,且空间的大小为最大成员变量的大小。

使用方式

访问成员操作:

A.操作符' . '

结构体变量名.成员变量名

union_name.number_var_name1;
S1.b = 21;

通过结构体类型变量访问 

B.操作符" -> "

结构体指针->成员变量名

union_piont_name.number_var_name1
union S* p;//联合体指针
p->b = 21;

初始化操作:

        联合体的初始化与结构体不同,结构体的每个成员都有单独的空间,就意味着每个成员都能初始化,而对于联合体则是共用同一块空间,每个成员变量的变化都会影响到其成员,所以通常则是想用哪个成员时,就单独给它赋值,而不是都拿出来赋值,那没意义

常见例子

商品的属性:

        不同的商品有相同的属性和不同的属性,比如衣服,书籍和手机,他们共有的属性就是价格,库存量等等;而对于衣服单独具有的属性就是尺码,颜色等等,对于书籍就是书名,作者等等,对于手机就是内存,处理器等等。

        那么想要将不同商品进行封装,那么就要将相同的属性和不同的属性进行封装,而不同的属性只有特定的商品才能,封装所有不同的属性就会使得结构体的内存大小非常大,这时就可以使用联合体来将不同的属性进行封装,节省空间。

//使用结构体封装商品
struct Cmd
{
    //共有的属性
    int price;//价格
    int stock;//库存量
    union
    {
        struct
        {
            int size;//尺寸
            char color[10];//颜色
        }clothes;
        struct
        {
            char book_name[20];//书名
            char author[20];//作者
        }book;
        struct
        {
            char memory[20];//内存
            char processor[20];//处理器
        };
    }item;

};

大小端字节序判断:

2.枚举

定义

        枚举是一些字符常量的集合,这些字符常量本质的类型都是int类型,就是一个int数值绑定了一个枚举常量有了另外一个名字,比如星期的一一例举,三原色等等。

声明方式

enum enum_name
{
    enum_elements 1,
    enum_elements 2,
    ...
    enum_elements n //枚举元素
};
  • enum                        枚举类型创建的关键字
  • enum_name             枚举类型的名字
  • enum_elements       枚举元素,为字符常量

注意:

  1. 枚举元素的表面上是字符常量,实际上就是整形数据的别名
  2. 给枚举元素初始化,那么默认第一个元素为0,往后依次增加
  3. 若给枚举元素初始化,该元素后面的元素的整形值依次增加
  4. 枚举元素之间是由逗号' , '隔开的,且最后一个后面没有逗号。
  5. 同一个枚举类型中不得含有相同字符的枚举元素。
  6. 枚举型是预处理指令#define的替代,宏是在预处理阶段将名字替换成对应的值,枚举则是在编译阶段将名字替换成对应的值。【补充】

例子:

typedef重命名 

typedef enum enum_name//在声明的关键字前加上重命名关键字
{
    enum_elements 1,
    enum_elements 2,
    ...
    enum_elements n //枚举元素
}new_enun_name;//在声明完后加上新的名字

变量创建

A.在声明时

enum enum_name{enum_elements 1,enum_elements 2, ...enum_elements n}枚举变量名;

B.通过结构体类型

enum enum_name{enum_elements 1,enum_elements 2, ...enum_elements n};//声明

enum enum_name 枚举变量名;

存储形式

        枚举类型在内存中的存储类似于联合体,枚举元素共用一块空间,也就是一个枚举元素的大小,而每个枚举元素事实上就是int类型,就是4个字节,所以对于任何枚举类型的空间大小都是4个字节。

使用方式

  1. 每个枚举类型的枚举元素事实上就是一个列表,而定义的枚举变量就是在这个列表中取值。
  2. 对C而言,可以给枚举变量赋值整形数值,而对于C++而言则更加严格,则不能。
  3. 枚举类型的变量只能使用该枚举类型中定义的枚举元素进行赋值,不能赋值枚举元素以外的值。

枚举的优点

【补充】

  1. 增加代码的可读性和可维护性。
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除#define定义的符号。
  4. 使用方便,一次可以定义多个常量。
  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。

【转载】


本章内容结束,下章见,拜拜!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值