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

C语言---自定义类型(下)(枚举和联合类型)

联合体

        联合体在语法的定义上跟结构体没有什么区别,主要的区别就是联合体的所有成员共用的是同一块内存空间,并且编译器会为联合体里边最大的一个成员分配足够的空间,所以联合体也叫共同体

        下边来看一个定义联合体的例子。

        由上边的代码,我们不仅知道了联合体是如何定义的,可以发现联合体的大小确实是与结构体的内存对齐是不一样的。

联合体的特点

        在上边我们就提到了联合体内部的成员是共用同一块内存空间的,也就意味着联合体的每个成员在内存中的地址也是同一个,这也导致了修改联合体的其中一个成员会导致整个联合体的数据发生变化,从下边的代码中也可以看出。

        接下来我们来感受一下修改联合体的其中一个成员变量会导致整个联合体发生变化的效果。

·        从上边的例子就可以看出,当我们给联合体的成员变量a赋值的时候,打印a的时候,里边的内容已经发生了变化,这就再一次说明了联合体是公用同一块内存空间的。

联合体大小的计算

        从上边的所有例子里边,我们似乎发现联合体的大小好像就是最大成员变量的大小,其实事实不是这样的。联合体的大小首先至少要满足最大的成员的大小,但当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

        由于在C语言---自定义类型(上)(结构体类型)-CSDN博客,已经详细说过内存对齐的事情了,这里就不再额外举例子了,总之,大家之后在计算联合体的大小的时候,要注意上边的两点要求。

联合体判断大小端

        在C语言---数据在内存中的存储-CSDN博客里边讲过一次判断程序是大端小端的方式,大家感兴趣可以去看看,本篇给出用联合体的方式来判断。

        由于联合体是共用同一块内存空间的,我可以给两个成员,一个char类型,一个int类型,给int类型的变量赋值1,用char类型的变量拿出这个数据,就只拿出了一个字节,如果是1,就说明是小端存储,如果是0,就说明是大端。

#include<stdio.h>union un
{char a;int b;
};int check_sys()
{union un un1 = { 0 };un1.b = 1;/*if (un1.a == 1){return 1;}else{return 0;}*/return un1.a;
}int main()
{if (check_sys() == 1)printf("是小端存储");elseprintf("是大端存储");return 0;
}

枚举类型

        枚举类型就是一一列举,把所有可能出现的值都一一列举出来,就比如一个星期从星期一到星期天。

enum week
{
    Mon,
    Tes,
    Wed,
    Tus,
    Frd,
    Sat,
    Sun
};

         {}里边是枚举的可能取值,也叫枚举常量,可以通俗的理解为,把一连串的常量都放在了一个枚举的类型里边,这样与#define定义的常量虽然几乎是可以同义替换的,但是枚举类型是由类型的限制的,并且#define定义的常量可以在整个工程里边使用,而枚举类型是遵循作用域范围的,相当于更加的安全一点。

        枚举体里边的常量也是有值的,从0开始,依次递增,当然,也可以给它们赋你想要的值。

        下边给一个完整的枚举的例子。

#include<stdio.h>
enum Sex
{MALE,FEMALE,SECRET
};int main()
{enum Sex man = MALE;return 0;
}

文章转载自:
http://antebrachium.kjawz.cn
http://anklebone.kjawz.cn
http://biophilosophy.kjawz.cn
http://berth.kjawz.cn
http://beachbound.kjawz.cn
http://autonym.kjawz.cn
http://carl.kjawz.cn
http://aspish.kjawz.cn
http://bichromate.kjawz.cn
http://baryonic.kjawz.cn
http://admittible.kjawz.cn
http://canceration.kjawz.cn
http://bazoom.kjawz.cn
http://barebacked.kjawz.cn
http://bakehouse.kjawz.cn
http://checkrein.kjawz.cn
http://chairbed.kjawz.cn
http://cabinetmaking.kjawz.cn
http://castiron.kjawz.cn
http://cheiromancy.kjawz.cn
http://benjamin.kjawz.cn
http://azathioprine.kjawz.cn
http://bleacher.kjawz.cn
http://bacteremic.kjawz.cn
http://adaptor.kjawz.cn
http://biopoesis.kjawz.cn
http://anglewing.kjawz.cn
http://cdma2000.kjawz.cn
http://audile.kjawz.cn
http://caduceus.kjawz.cn
http://www.dtcms.com/a/281186.html

相关文章:

  • 利用DeepSeek为chdb命令行客户端添加输出重定向和执行SQL脚本功能
  • nlp论文:分本分类:《Bag of Tricks for Efficient Text Classification》
  • VirtualBox网络配置全指南:桥接、Host-Only与双网卡实战
  • 2025华为ODB卷-士兵过河-三语言题解
  • 限制apk使用时长第二篇-限制/拦截Apk启动-应用锁功能
  • 创客匠人:创始人 IP 变现,从 “单点尝试” 到 “生态赋能” 的跨越
  • S7-200 SMART PLC:不同CPU及数字量 IO 接线全解析
  • ESLint 配置错误:ReferenceError: prettier is not defined 解决方案
  • 运维技术教程之Jenkins上的known_hosts文件
  • 高频高密度趋势下磁芯材料评价指标探讨
  • UVM(1)—配置环境
  • 算法学习day16----Python数据结构--模拟队列
  • 传统三层网络架构和现代数据中心网络架构(如思科 ACI 的 Spine-Leaf 架构)的对比和分析(Grok3 回答)
  • Mac电脑上无需卸载即可切换使用多个EasyConnect客户端的解决方案
  • Docker安装升级redis,并设置持久化
  • 使用 sudo iftop -i 分析服务器带宽使用情况
  • 一文读懂语义解析技术:从规则到神经网络的演进与挑战
  • PPP 链路及 MP 捆绑与 CHAP 验证实验
  • 从零开始学前端html篇3
  • Missing classes detected while running R8解决
  • 创客匠人:从 IP 到变现,定位是构建价值闭环的核心
  • Elasticsearch的深度翻页问题
  • Git本地操作完全指南:从入门到精通
  • 创客匠人:创始人 IP 打造,知识变现的时代必然
  • Elasticsearch 9.x 搜索执行流程(源码解读)
  • 深度学习中的激活函数:从原理到 PyTorch 实战
  • CentOS服务器安装Supervisor使队列可以在后台运行
  • 【用unity实现100个游戏之33】用Unity手搓一个类【红色警戒|魔兽争霸|帝国时代|星际争霸】3D RTS游戏(附源码)
  • vue openlayer创建地图弹框overlay
  • 【html常见页面布局】