当前位置: 首页 > ai >正文

联合体和枚举类型

1.联合体类型

1.1:联合体类型变量的创建

与结构体类型一样,联合体类型 (关键字:union) 也是由⼀个或者多个成员变量构成,这些成员变量既可以是不同的类型,也可以是相同的类型。但是编译器只为最⼤的成员变量分配⾜够的内存空间。联合体的特点是所有成员变量共⽤同⼀块内存空间。所以联合体也叫共用体。而结构体中每个成员变量都有自己独立的空间。

#include<stdio.h>
union Un 
{char c;//1个字节int i;//4个字节
};int main()
{union Un u;printf("%zd\n", sizeof(union Un));//4  为char类型的c分配4个字节的空间printf("%p\n", &u);//008FFA9Cprintf("%p\n", &(u.c));//008FFA9Cprintf("%p\n", &(u.i));//008FFA9C//联合体类型变量u与成员c、成员i的地址相同,由此可见,联合体中的成员是共用同一块内存空间的return 0;
}

在这里插入图片描述

1.2:给联合体中一个成员变量赋值时,其他成员变量的值也会发生变化。

在这里插入图片描述

1.3:相同成员的结构体类型和联合体类型的对比

在这里插入图片描述

1.4:联合体类型变量的大小

在这里插入图片描述

#include <stdio.h>
union Un1
{//当成员变量是数组时,对齐数 = 数组元素的大小与编译器默认的对齐数中的较小值char c[5];//数组元素占1个字节,编译器默认的对齐数是8,则c的对齐数是1int i;//i占4个字节,编译器默认的对齐数是8,则i的对齐数是4//所有成员中,最大的对齐数是4,则该联合体类型的大小必须是4的倍数
};
union Un2
{//当成员变量是数组时,对齐数 =数组元素的大小与编译器默认的对齐数中的较小值short c[7];//数组元素占2个字节,编译器默认的对齐数是8,则c的对齐数是2int i;//i占4个字节,编译器默认的对齐数是8,则i的对齐数是4//所有成员中,最大的对齐数是4,则该联合体类型的大小必须是4的倍数
};
int main()
{printf("%d\n", sizeof(union Un1));//8printf("%d\n", sizeof(union Un2));//16return 0;
}

1.5:结构体类型与联合体类型的对比

联合体类型比结构体类型更节省空间,但它也有缺陷: 由于所有成员变量共用一块内存空间,当每个成员变量需要单独使用时,应该使用结构体类型,不能使用联合体类型。
在这里插入图片描述

1.6:利用联合体类型,写一个程序,判断当前机器是大端字节序存储还是小端字节序存储。

int check_sys()
{union   //匿名联合体类型,易知该类型占4个字节{int i;char c;}un;un.i = 1;//1的补码00000000000000000000000000000001//1的补码的16进制表示形式:0x00000001return un.c;//返回1是⼩端,返回0是⼤端
}

在这里插入图片描述

2.枚举类型

2.1:枚举类型变量的创建

枚举的关键字enum
在这里插入图片描述

enum Sex//性别
{//下面是枚举类型变量的可能取值,这些值都是常量。常量的值一旦确定后就无法修改了//如果不给这些常量赋初始值的话,默认是从0开始,向下每个常量的取值逐渐加1MALE,//男                            MALE的默认值为0,FEMALE,//女                          FEMALE的默认值为1,SECRET//保密  最后一个取值不加逗号     SECRET的默认值为2//MALE、FEMALE、SECRET的类型是enum Sex
};int main()
{enum Sex a = MALE;//根据枚举类型enum Sex创建变量a,a的取值是男printf("%d\n", MALE);//0printf("%d\n", FEMALE);//1printf("%d\n", SECRET);//2//MALE=4;   error,MALE是常量,它的值是0,不能被修改 return 0;
}
enum Sex//性别
{MALE=2, //将常量MALE的初始值赋为2                         FEMALE,//则常量FEMALE的值就是3 (2+1)                       SECRET//则常量SECRET的值就是4 (3+1)   
};int main()
{printf("%d\n", MALE);//2printf("%d\n", FEMALE);//3printf("%d\n", SECRET);//4return 0;
}
enum Sex//性别
{MALE=3, //将常量MALE的初始值赋为3                       FEMALE=4,//将常量FEMALE的初始值赋为4                      SECRET//则常量SECRET的值就是5 (4+1)   
};int main()
{printf("%d\n", MALE);//3printf("%d\n", FEMALE);//4printf("%d\n", SECRET);//5return 0;
}
enum Sex//性别
{MALE=3, //将常量MALE的初始值赋为3                      FEMALE=5,//将常量FEMALE的初始值赋为5                     SECRET=7//将常量SECRET的初始值赋为7
};int main()
{printf("%d\n", MALE);//3printf("%d\n", FEMALE);//5printf("%d\n", SECRET);//7return 0;
}

2.2:枚举类型需要注意的地方

可以将整数赋值给枚举类型的变量吗?在C语⾔中是可以的,但是在C++是不⾏的,因为C++的类型检查⽐较严格。

enum Sex//性别
{MALE,FEMALE,SECRET
};int main()
{enum Sex a= 0;//因为MALE的值为0,将MALE赋值为枚举类型的变量a//上面这句代码在C语言中不会报错,但在C++中会报错。因为C++的类型检查比较严格,C++中认为赋值符号右边的0是int类型,而a是enum Sex类型,所以不能把0赋值给a//可以把上面这行代码替换成enum Sex a= MALE;这样无论是C语言还是C++中都不会报错return 0;
}
http://www.xdnf.cn/news/1854.html

相关文章:

  • WebUI可视化:第4章:Streamlit数据可视化实战
  • uni-app 小程序中的定位问题 以及 页面安全距离
  • 【前端】如何检查内存泄漏
  • 中国250米土壤质地类型数据
  • 上海SMT贴片加工核心工艺与优化方案
  • 文档编辑:reStructuredText全面使用指南 — 第四部分 高级主题
  • 自然语言处理将如何颠覆未来教育?个性化学习新纪元
  • 潮了 低配电脑6G显存生成60秒AI视频 本地部署/一键包/云算力部署/批量生成
  • aws(学习笔记第三十九课) iot-msk-pipeline
  • 【开源工具】Python打造高颜值串口调试助手:支持自动收发+历史记录+多主题切换(附完整源码)
  • 不会挖竞品关键词?你每天都在浪费 50% 的 SEO 预算!
  • Linux的基础指令
  • 实战指南:搭建智慧变电站管理平台全流程解析(二)
  • Flutter Dart中的函数参数 默函数的定义 可选参数 箭头函数 匿名函认参数 命名参类数 闭包等
  • 第八章.干货干货!!!SpringAI手撸MCP服务
  • C++ 的 trivially relocatable
  • 解决ssh拉取服务器数据,要多次输入密码的问题
  • PyTorch 实现食物图像分类实战:从数据处理到模型训练
  • 植物合成生物学:上帝之手,万物皆可合
  • 【MQ篇】RabbitMQ的消费者确认机制实战!
  • 【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能
  • 脚本批量启动Node服务器
  • 【金仓数据库征文】_AI 赋能数据库运维:金仓KES的智能化未来
  • 复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
  • 计算机组成原理第二章 数据的表示和运算——2.1数制与编码
  • HTMLcss实现网站抽奖
  • Ubuntu 下 Nginx 1.28.0 源码编译安装与 systemd 管理全流程指南
  • 本地使用Ollama部署DeepSeek
  • 30天通过软考高项-第三天
  • redis 数据类型新手练习系列——string类型