首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >自定义类型:联合体和枚举

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

作者头像
用户12004530
发布2026-01-23 14:57:42
发布2026-01-23 14:57:42
1080
举报

联合体

联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型, 但是编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用同⼀块内存空间,所以联合体也叫:共用体

给联合体其中⼀个成员赋值,其他成员的值也跟着变化

代码语言:javascript
复制
//联合体类型的声明
union Un
{
    char c;
    int i;
};
int main()
{
  //联合变量的定义
    union Un s={0};
  //计算变量大小
    printf("%zd",sizeof(s));
    return 0;
}

那为什么是4个字节呢?

联合体的特点

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

代码语言:javascript
复制
#include <stdio.h>
//联合类型的声明
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	// 下⾯输出的结果是⼀样的吗?
	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c));
	printf("%p\n", &un);
	return 0;
}

此时观察到i和c和un的地址都是一样的,说明这块地址既可以填i,也可以填c还可以填un,使用i的时候就改变了c,使用c的时候就改变了i,我们来调试看一下

i的地址就是0x008FF7F0,c的地址就是0x008FF7F0,已经把c的十六进制数放在了i的位置上

相同成员的结构体和联合体对比

联合体大小的计算

联合的大小至少是最大成员的大小

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

代码语言:javascript
复制
#include <stdio.h>
union Un1
{
	char c[5];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union Un1));
	return 0;

}

本来想的是char类型的字符有5个,就占用5个字节,整型有一个,就占用一个字节,那最大空间就应该有5个,那为什么这里是8呢?

这是因为char类型为1个字节,VS默认为8,那这里就是1,int类型占4个字节,VS默认为8,那这里就是4,上面说了“当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍”,这里4个字节存不下5个字节的数据,就要再浪费3个字节,组成最大对齐数的倍数,所以就是8

现在大家做一下这个题

代码语言:javascript
复制
#include <stdio.h>
union Un2
{
	short c[7];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union Un2));
	return 0;

}

使用联合体是可以节省空间

例如:我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息

图书:书名、作者、页数

杯子:设计

衬衫:设计、可选颜色、可选尺寸 

那我们不耐心思考,直接写出⼀下结构

代码语言:javascript
复制
struct gift_list
{
//公共属性
 int stock_number;//库存量
 double price; //定价
 int item_type;//商品类型
 //特殊属性
 char title[20];//书名
 char author[20];//作者
 int num_pages;//⻚数
 char design[30];//设计
 int colors;//颜⾊
 int sizes;//尺⼨
}

上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存,因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的,比如: 商品是图书,就不需要design、colors、sizes,所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存

代码语言:javascript
复制
#include<stdio.h>
struct gift_list
{
    int stock_number;//库存量
    double price; //定价
    int item_type;//商品类型
    union {
        struct
        {
            char title[20];//书名
            char author[20];//作者
            int num_pages;//⻚数
        }book;

        struct
        {
            char design[30];//设计

        }mug;

        struct
        {
            char design[30];//设计
            int colors;//颜⾊
            int sizes;//尺⼨

        }shirt;
    }item;
};

联合体的一个练习

代码语言:javascript
复制
int check_sys()
{
union
{
    you i;
    Tank C;
}a;
    a.i = 1;
}
return un.c;  //返回1是⼩端,返回0是⼤端

枚举

枚举类型的声明

枚举顾名思义就是⼀⼀列举

把可能的取值⼀⼀列举

比如:一周的星期一到星期日是有限的7天,可以⼀⼀列举

代码语言:javascript
复制
enum Day   //星期
{
    Mon,
    Tues,
    Wed,
    Thur,
    Fri,
    Sat,
    Sun
};
int main()
{
    enum Day s=Fri;
    return 0;
}

这里面的逗号是枚举类型的一种方式,我再用这个枚举类型创建一个变量叫做“s”  

那现在我们枚举里面的值打印出来看一下

代码语言:javascript
复制
#include<stdio.h>
enum Day   
{
    Mon,Tues,Wed,Thur,Fri,Sat,Sun
};
int main()
{
    printf("%zd\n", Mon);
    printf("%zd\n", Tues);
    printf("%zd\n", Wed);
    printf("%zd\n", Thur);
    printf("%zd\n", Fri);
    printf("%zd\n", Sat);
    printf("%zd\n", Sun);
    return 0;
}

此时可以按到枚举常量默认是从0开始,那我们可不可以改一下初始值

代码语言:javascript
复制
#include<stdio.h>
enum Day   
{
    Mon=3,Tues,Wed,Thur,Fri,Sat,Sun
};
int main()
{
    printf("%zd\n", Mon);
    printf("%zd\n", Tues);
    printf("%zd\n", Wed);
    printf("%zd\n", Thur);
    printf("%zd\n", Fri);
    printf("%zd\n", Sat);
    printf("%zd\n", Sun);
    return 0;
}

枚举类型的优点

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

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

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

使用方便,一次可以定义多个常量

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

枚举类型的使用

代码语言:javascript
复制
enum Color  //颜色
{
    RED=1,
    GREEN=2,
    BLUE=4
    enum Co
};
int main()
{
    enum Color clr = GREEN;  //使⽤枚举常量给枚举变量赋值
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 联合体
    • 联合体类型的声明
    • 联合体的特点
    • 相同成员的结构体和联合体对比
    • 联合体大小的计算
    • 使用联合体是可以节省空间
    • 联合体的一个练习
  • 枚举
    • 枚举类型的声明
    • 枚举类型的优点
    • 枚举类型的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档