当前位置:   article > 正文

联合体和枚举<C语言>

联合体和枚举<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字节
  25. int main() {
  26. struct goods goods_1 = { 10,30,2005,.item.book = {"yuhua",200,1998} };
  27. //这里初始化了结构体goods中,公共属性中的进货量、价格、生产年份,
  28. // 以及联合体item中的结构体book三个成员:作者、页数、版号
  29. return 0;
  30. }

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.

也可更改:

枚举的声明以及使用

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/713364
推荐阅读
相关标签
  

闽ICP备14008679号