ToB企服应用市场:ToB评测及商务社交产业平台

标题: 联合体和罗列<C语言> [打印本页]

作者: 农妇山泉一亩田    时间: 2024-6-11 10:15
标题: 联合体和罗列<C语言>
导言

        在C语言中除了结构体外,联合体和罗列也是自界说范例,联合体主要用于节省空间,在同一块内存存储多种范例的数据,而罗列可以进步代码的可读性、可维护性。

联合体(union)

它另有个更容易理解的名字:“共用体”,它有多个成员,成员可以为差异范例,但是编译器只会给最大的成员分配内存空间,全部成员共用一块空间。

联合体的创建

  1. //联合体的创建
  2. union un {
  3.         int x;
  4.         int y;
  5. };
  6. int main() {
  7.         union un tmp = { 0 };
  8.         return 0;
  9. }
复制代码

 联合体的初始化

联合体的初始化只能对整个联合体举行初始化,由于全部联合成员共用一块内存,初始化后全部的成员都是这个值,不管成员范例是否同等。

联合体的访问与结构体同等,这里不再介绍

联合体的巨细


联合体巨细盘算规则:
●联合体巨细最少为最大成员的巨细
●当最大成员的巨细不为最大对齐数的整数倍时,联合体巨细要对齐到最大对齐数的整数倍

示例:

 值得注意的是:在盘算数组的对齐数时,与默认数比较的不是整个数组的巨细,而是数组单个元素的巨细。

联合体的运用


1.假如一家市肆要进一批货,分别为书、卡牌、玩具。这三样物品都有公共属性和私有属性

公共属性:进货量、价格、生产年份
私有属性:
●书:作者、页数、版号
●卡牌:形状(圆或方)
●玩具:颜色、尺寸

使用结构体界说:
  1. struct goods {
  2.         //公共属性:进货量、价格、生产年份
  3.         int count;
  4.         int price;
  5.         int year;
  6.         //私有属性:
  7.         //书:作者、页数、版号
  8.         char name[20];
  9.         int pages;
  10.         int vn;
  11.         //卡牌:形状(圆或方)
  12.         int shape;
  13.         //玩具:颜色、尺寸
  14.         char color[10];
  15.         int size;
  16. };//占用空间60字节
复制代码
使用联合体界说:
  1. struct goods {
  2.         //公共属性:进货量、价格、生产年份
  3.         int count;
  4.         int price;
  5.         int year;
  6.         //私有属性:
  7.         union {
  8.                 struct {
  9.                         //书:作者、页数、版号
  10.                         char name[20];
  11.                         int pages;
  12.                         int vn;
  13.                 }book;
  14.                 struct {
  15.                         //卡牌:形状(圆或方)
  16.                         int shape;
  17.                 }card;
  18.                 struct {
  19.                         //玩具:颜色、尺寸
  20.                         char color[10];
  21.                         int size;
  22.                 }toy;
  23.         }item;
  24. };//占用空间40字节
复制代码
 在这个例子中使用结构体占用了60字节,使用联合体却只用了40字节,第二种方法声明比较复杂,我们怎么来对它举行初始化呢?
  1. struct goods {
  2.         //公共属性:进货量、价格、生产年份
  3.         int count;
  4.         int price;
  5.         int year;
  6.         //私有属性:
  7.         union {
  8.                 struct {
  9.                         //书:作者、页数、版号
  10.                         char name[20];
  11.                         int pages;
  12.                         int vn;
  13.                 }book;
  14.                 struct {
  15.                         //卡牌:形状(圆或方)
  16.                         int shape;
  17.                 }card;
  18.                 struct {
  19.                         //玩具:颜色、尺寸
  20.                         char color[10];
  21.                         int size;
  22.                 }toy;
  23.         }item;
  24. };//占用空间40字节int main() {        struct goods goods_1 = { 10,30,2005,.item.book = {"yuhua",200,1998} };        //这里初始化了结构体goods中,公共属性中的进货量、价格、生产年份,        // 以及联合体item中的结构体book三个成员:作者、页数、版号        return 0;}
复制代码
2.通过联合体其数据范例交换的特性,完成对巨细端字节序的判定
  1. union un {
  2.         char a;
  3.         int b;
  4.         //定义一个拥有char型和int型的联合体,来观察其大小端字节序
  5. };
  6. int main() {
  7.         union un un1 = { 0x11223344 };
  8.         //存入16进制数0x11223344来观察,小端存储:0X44332211、大端存储:0X11223344
  9.         printf("%#X", un1.a);//使用联合体成员char a,来打印第一个字节内容来观察大小端
  10.         return 0;
  11. }
复制代码

运行效果:

小端存储。

罗列(enum)

罗列顾名思义:一一列举。
我们可以为一组数值界说相同范例的符号名(罗列常量),如:
周一到周日、一月到十二月、三原色等。

罗列的创建

  1. //枚举的创建
  2. enum en {
  3.         monday,//注意枚举常量后面是“,”逗号,从0开始
  4.         tuesday,
  5.         wednesday,
  6.         thursday,
  7.         friday,
  8.         saturday,
  9.         sunday,
  10. };
复制代码
 罗列常量在创建时是有初值的,默认从0开始,步长为1.
也可更改:

罗列的声明以及使用


 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4