完整教程:C语言自学--自定义类型:联合和枚举

news/2025/10/30 14:17:00/文章来源:https://www.cnblogs.com/yangykaifa/p/19176893

目录

1、联合体

1.1 、联合体类型的声明

1.2、联合体的特性

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

1.4、联合体大小的计算方法

1.5、联合的一个练习

2、枚举类型

2.1、枚举类型声明

2.2、枚举类型的优势

2.3、枚举类型的应用


1、联合体

  • 1.1 、联合体类型的声明

        与结构体类似,联合体也是由多个成员组成,这些成员可以是不同类型。但其独特之处在于:

  1. 编译器仅按最大成员所需空间分配内存
  2. 所有成员共享同一块内存空间
  3. 当修改任一成员值时,其他成员的值也会随之改变

        因此联合体也被称为"共用体"。

  • #include 
    //联合类型的声明
    union Un
    {char c;int i;
    };
    int main()
    {//联合变量的定义union Un un = { 0 };//计算连个变量的⼤⼩printf("%d\n", sizeof(un));return 0;
    }

         联合类型的特点是所有成员共享同一块内存空间,联合的大小等于其最大成员的大小。在这个例子中:

  • char c 占用1字节
  • int i 在大多数系统上占用4字节
  • 因此整个联合 un 的大小为4字节

  • 1.2、联合体的特性

        联合体的所有成员共享同一块内存空间,因此联合体变量的大小至少等于其最大成员的尺寸(必须确保能够容纳最大的数据成员)。

  • //代码1
    #include 
    //联合类型的声明
    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;
    }

        输出结果:


  • //代码2
    #include 
    //联合类型的声明
    union Un
    {char c;int i;
    };
    int main()
    {//联合变量的定义union Un un = { 0 };un.i = 0x11223344;un.c = 0x55;printf("%x\n",un.i);//十六进制: %x (小写) / %X (大写)return 0;
    }

    输出结果:

    11223355

            代码1输出的三个地址一模一样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。 我们仔细分析就可以画出,un的内存布局图。

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

        让我们对比一下相同成员的结构体和联合体的内存布局差异。

  •  struct S{char c;int i;};struct S s = {0};
  • union Un
    {char c;int i;
    };
    union Un un = { 0 };

  • 1.4、联合体大小的计算方法

                1、联合的大小至少是最大成员的大小。

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

  • #include 
    union Un1
    {char c[5]; //5  1	8	1int i;	      //4	8	4
    };
    union Un2
    {short c[7];//14  2	8	2int i;	   //    4  8   4
    };
    int main()
    {//下⾯输出的结果是什么?printf("%d\n", sizeof(union Un1));//8  最大对齐数是4,他的2倍数刚好>=5printf("%d\n", sizeof(union Un2));//16 最大对齐数是4,他的4倍数刚好>=14return 0;
    }

        使用联合体可以有效节省内存空间。例如,我们需要设计一个礼品兑换系统,其中包含三类商品:图书、杯子和衬衫。每种商品都具备以下共有属性:库存量、价格和商品类型,同时每种商品类型还包含特有的属性信息:

  • 图书:书名、作者、页数
  • 杯子:设计样式
  • 衬衫:设计样式、可选颜色、可选尺码

        如果不假思索地直接设计结构体,可能会得到如下实现:

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等属性。因此,我们可以将公共属性单独列出,其余商品特有属性使用联合体存储,这样能有效减少内存占用,实现内存优化。

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];//设计}cup;struct{char design[30];//设计int colors;		//颜色int sizes;		//尺寸}shirt;};
};
int main() {struct gift_list item1;item1.stock_number = 50;item1.price = 19.99;item1.item_type = 1;strcpy(item1.book.title, "C Programming");//把C Programming字符串复制到book对象中的titlestrcpy(item1.book.author, "K&R");	//把K&R复制到book对象中的authoritem1.book.num_pages = 300;printf("Book: %s by %s, %d pages\n", item1.book.title, item1.book.author, item1.book.num_pages);return 0;
}
  • 1.5、联合的一个练习

        写一个程序,判断当前机器是大端?还是小端?

//判断是大端还是小端
#include 
int main()
{int a = 1;//00 00 00 01  大端//01 00 00 00  小端//把int强转为char判断第一个字节是不是为1就行if (*(char*)&a ==1){printf("小端");}else{printf("大端");}return 0;
}

        方法二:

//判断是大端还是小端
#include 
union Un
{char c;int i;
}un;
int main()
{//00 00 00 01  大端//01 00 00 00  小端un.i = 1;if (un.c ==1){printf("小端");}else{printf("大端");}return 0;
}


2、枚举类型

  • 2.1、枚举类型声明

枚举是一种将可能取值一一列出的数据类型。例如生活中的常见场景:

  • 一周七天(周一到周日)
  • 性别分类(男、女、保密)
  • 十二个月份
  • 三原色(红、黄、蓝)

这些具有明确范围的离散值,都可以通过枚举来清晰表示。

enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,sun
};
enum Sex //性别
{MALE,FAMALE,SECRET
};
enum Color//颜⾊
{RED,GREEN,BLUE
};

        上面定义的enum Day,enum Sex,enum Color都是枚举类型。{}中的内容是枚举类型的可能取值,也叫 枚举常量。 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Color//颜⾊
{RED = 2,GREEN = 4,BLUE = 8
};
  • 2.2、枚举类型的优势

为什么要使用枚举?虽然可以使用#define定义常量,但枚举具有以下优势:

#define MALE 3
#define FEMALE 5
#define SECRET 7
enum Sex
{//该枚举类型的三种可能取值//他们都是常量,被称为枚举常量MALE 3, //0 默认0开始FEMALE 5,//1SECRET 7 //2
};
  1. 增加代码的可读性和可维护性
  2. 相比#define定义的标识符,枚举具有类型检查功能,更加严谨可靠
  3. 便于调试,预处理阶段会删除 #define 定义的符号
  4. 使用更便捷,可以一次性定义多个相关常量
  5. 遵循作用域规则,在函数内声明的枚举仅在该函数内有效
  • 2.3、枚举类型的应用
enum Color//颜⾊
{RED = 1,GREEN = 2,BLUE = 4
};
enum Color clr1 = GREEN;//使⽤枚举常量给枚举变量赋值
enum Color clrw = 2;//C语言中可以,但c++不行,因为这是把一个整型赋值给一个enum Color枚举类型

        能否用整数直接给枚举变量赋值?在C语言中是允许的,但C++不支持这种操作,因为C++的类型检查机制更为严格。

  • enum Color clrw = 2;

        C语言中可以,因为C语言类型审查不严格,但c++不行,因为这是把一个整型2赋值给一个enum Color枚举类型。

#include 
enum Option
{Exit,//0Add,//1Sub,Mul,Div
};
void menu()
{printf("**************************************\n");printf("********** 0.Exit   1.Add  ***********\n");printf("********** 2.Sub    3.Mul  ***********\n");printf("********** 2.Div    0.Exit ***********\n");printf("**************************************\n");
}
int main()
{int input = 0;do{menu();scanf("%d", &input);switch (input){case Add:break;case Sub:break;case Mul:break;case Div:break;case Exit:break;default:printf("输入错误,请重新输入:\n");break;}} while (input);return 0;
}
#include 
enum Option
{EXIT,//0ADD,//1SUB,MUL,DIV
};
int Add(int x,int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}
void menu()
{printf("**************************************\n");printf("********** 0.Exit   1.Add  ***********\n");printf("********** 2.Sub    3.Mul  ***********\n");printf("********** 4.Div    0.Exit ***********\n");printf("**************************************\n");
}
int main()
{int input = 0;int num1, num2, result;do{menu();printf("请选择运算方法:");scanf("%d", &input);switch (input){case ADD:printf("请输入要操作的两个数:");scanf("%d %d", &num1, &num2);result = Add(num1, num2);printf("计算结果为:%d\n",result);break;case SUB:printf("请输入要操作的两个数:");scanf("%d %d", &num1, &num2);result = Sub(num1, num2);printf("计算结果为:%d\n", result);break;case MUL:printf("请输入要操作的两个数:");scanf("%d %d", &num1, &num2);result = Mul(num1, num2);printf("计算结果为:%d\n", result);break;case DIV:printf("请输入要操作的两个数:");scanf("%d %d", &num1, &num2);result = Div(num1, num2);printf("计算结果为:%d\n", result);break;case EXIT:break;default:printf("输入错误,请重新输入:\n");break;}} while (input);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序中的H5网页在关怀模式下页面排版变乱的解决办法

微信小程序中的H5网页在关怀模式下页面排版变乱的解决办法在开发当中呢,经常会有很多H5的小活动页面,需要在微信的环境下使用。偶尔会出现H5页面在微信或者其他客户端中出现字体变大的问题,下面提供解决方法 首先先…

2025年比较好的opp束带母卷热门厂家推荐榜单

2025年优质OPP束带母卷热门厂家推荐榜单 随着工业自动化与包装需求的持续增长,OPP束带母卷作为高效、环保的包装耗材,广泛应用于电子、食品、医药等领域。选择一家技术成熟、品质稳定的供应商至关重要。本文基于技术…

详细介绍:WSL 提速配置 checklist

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月GEO(AI搜索优化)品牌源头厂家推荐排行榜:AI驱动营销新纪元的领航者

文章摘要 2025年下半年,GEO营销行业迎来AI技术深度融合的关键转折点,基于大模型的智能营销解决方案正重塑行业格局。本文深度解析当前最热门的GEO品牌排名,重点推荐摘星AI的企业级垂直大模型解决方案,为寻求数字化…

2025 年钢桶厂家最新推荐榜,技术实力与市场口碑深度解析,筛选优质品牌助力企业采购304 不锈/实验室不锈/镀锌/烤漆/PVF 内涂钢桶公司推荐

引言 为助力企业精准选购钢桶产品,本次 2025 年钢桶产品最新推荐榜,结合包装联合会工业包装专业委员会近一年测评数据生成。测评采用 “三维九项” 体系,从生产实力(含产能、基地布局、设备自动化率)、技术水平(…

[JXCSP-S-S2019 江西] 多叉堆

SolutionLink 对多叉堆组合计数的理解加深了! 观察操作 1:将 \(x\) 所在树的 根 直接接在 \(y\) 所在树 树根 之下。感性理解一下,树合并之后的形态是类似的,也就是说更新完祖先的值之后自身不会有任何的变动。并且…

2025 年吨桶源头厂家最新推荐榜,技术实力与市场口碑深度解析,甄选优质生产企业叉车专用吨桶/热镀锌外框吨桶公司推荐

引言 在工业包装领域,吨桶的品质与供应稳定性对企业生产至关重要。本次 2025 年吨桶源头厂家推荐榜,由包装联合会联合行业权威测评机构共同打造,测评过程严格遵循《工业包装容器质量评估标准》。测评数据涵盖全国 2…

2025年知名的来力台球桌厂家最新TOP实力排行

2025年知名的来力台球桌厂家最新TOP实力排行 台球运动作为一项兼具竞技性与娱乐性的活动,近年来在国内持续升温,带动了台球桌及器材市场的蓬勃发展。2025年,随着消费者对品质与服务的需求升级,台球桌厂家的综合实…

2025年热门的大冰花钛杯最新TOP厂家排名

2025年热门的大冰花钛杯最新TOP厂家排名 随着健康生活理念的普及,钛杯因其轻便、耐腐蚀、无重金属析出等优势,成为消费者追捧的日常用品。大冰花钛杯因其独特的冰花纹理和卓越的保温性能,在2025年市场表现尤为亮眼…

2025 年磨床厂家最新推荐榜,涵盖数控内圆 / 复合 / 立式等类型,技术实力与市场口碑深度解析立式内圆/立式外圆/主轴/深孔内圆磨床公司推荐

引言 为精准筛选磨床领域优质企业,本次推荐榜联合机床工具工业协会、全国金属切削机床标准化技术委员会开展测评,参考《GB/T 15375-2017 金属切削机床 型号编制方法》等国家标准,从技术实力(专利数量、研发投入占比…

【金融行业案例】借助DHTMLX打造高效银行排班与管理系统

近日,DHTMLX 再次与北美软件开发商 Point Enterprises Inc. 展开深入交流,了解其基于 DHTMLX Suite 与 Scheduler 的银行员工排班系统 StaffPro 的最新成果。该系统通过灵活的组件组合与定制化开发,实现了跨网点员工…

PHY6252低成本BLE5.2智能灯控智能家居蓝牙透传芯片模块 - 动能世纪

简介PHY6252是一款支持BLE 5.2功能的系统级芯片(SoC),集成了低功耗的高性能多模射频收发机,搭载32位高性能低功耗处理器,提供64K retention SRAM、可选512/256K Flash、96KB ROM以及256bit efuse,支持基于BLE的安…

2025 年青铜厂家最新推荐榜,技术实力与市场口碑深度解析,筛选优质供应商助力企业采购铍青铜/镉青铜/铬青铜/磷青铜/硅青铜/锡铅青铜公司推荐

引言 为精准筛选出 2025 年青铜材料领域优质供应商,本次推荐榜由有色金属工业协会联合行业权威检测机构共同开展测评。测评过程严格遵循《工业用青铜材料供应商评价规范》,从企业综合实力、技术研发能力、产品质量稳…

ngnix使用try_files命令进行history路由的适配

ngnix使用try_files命令进行history路由的适配server { listen 7860; gzip on; gzip_min_length 1k; gzip_comp_level 9; gzip_types text/plain application/javascript application/x-javascript tex…

【工业检测行业案例】借助TeeChart打造高精度材料强度可视化测试系统

在蠕变试验或疲劳裂纹扩展试验等场景中,系统需同时监测载荷、变形、温度、时间等参数,借助 TeeChart 的多轴、对数及实时绘制能力,操作员可快速识别应力趋势、材料屈服点及潜在失效阶段。在材料力学测试领域,数据可…

2025年质量好的化工厂清淤机器人厂家最新权威实力榜

2025年质量好的化工厂清淤机器人厂家最新权威实力榜随着工业自动化技术的快速发展,化工厂清淤作业正经历着从传统人工向智能化、机械化方向的革命性转变。清淤机器人凭借其高效、安全、环保等优势,已成为现代化工厂维…

英语从句三大类

英语的从句(subordinate clause)按语法功能分为 三大类: 类别 功能 举例 在主句中充当 名词性从句(Noun Clause) 像名词一样 I know that he is right. 主语 / 宾语 / 表语 / 同位语 定语从句(Relative Clause)…

2025年评价高的网眼布厂家最新TOP排行榜

2025年评价高的网眼布厂家最新TOP排行榜 在纺织行业中,网眼布因其透气性、轻便性和耐用性,被广泛应用于鞋材、服装、家纺、箱包等领域。随着市场需求的不断增长,优质的网眼布供应商成为众多企业的首选。本文根据20…

27

所学知识;9小时 博客量:1 代码量:一百 所学知识:软件设计实验3: [实验任务一]:加密算法 目前常用的加密算法有DES(Data Encryption Standard)和IDEA(International Data Encryption Algorithm)国际数据加密算…

机器学习之噪声

在机器学习中,“噪声”是指数据中存在的、不提供有效信息、甚至会干扰模型学习和泛化能力的任何随机或无关的数据。我们可以用“数据 = 信号 + 噪声”来理解,其中“信号”是数据中真正的潜在模式和规律,而“噪声”则…