史上最强C语言教程----枚举和联合

x33g5p2x  于2022-02-07 转载在 其他  
字(1.9k)|赞(0)|评价(0)|浏览(429)
  1. 枚举

3.1 枚举类型的定义

3.2 枚举的优点

3.3 枚举的使用

3.4 枚举类型的大小

  1. 联合(共用体)

4.1 联合类型的定义

4.2 联合的特点

4.2.1 特点阐述

4.2.2 特点应用----判断大小端

4.3 联合大小的计算

3. 枚举

3.1 枚举类型的定义

  1. #include<stdio.h>
  2. enum Day//星期
  3. {
  4. Mon,
  5. Tues,
  6. Wed,
  7. };
  8. int main()
  9. {
  10. printf("%d %d %d", Mon, Tues, Wed);
  11. return 0;
  12. }

运行截图:

{}中的内容是枚举类型的可能取值,也叫 枚举常量 。

这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。

例如:

  1. #include<stdio.h>
  2. enum Color//颜色
  3. {
  4. RED = 1,
  5. GREEN,
  6. BLUE = 4
  7. };
  8. int main()
  9. {
  10. printf("%d %d %d",RED,GREEN,BLUE);
  11. return 0;
  12. }

运行截图:

 3.2 枚举的优点

1. 增加代码的可读性和可维护性

2. 和#define定义的标识符比较枚举有类型检查,更加严谨。

3. 防止了命名污染(封装)

4. 便于调试

5. 使用方便,一次可以定义多个常量

3.3 枚举的使用

  1. enum Color//颜色
  2. {
  3. RED = 1,
  4. GREEN = 2,
  5. BLUE = 4
  6. };
  7. enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
  8. clr = 5;//ok?这样是不可以的,因为左右类型不一致

3.4 枚举类型的大小

  1. #include<stdio.h>
  2. enum sex
  3. {
  4. MALE,
  5. FEMALE,
  6. SECRET
  7. };
  8. int main()
  9. {
  10. enum sex s = FEMALE;
  11. printf("%d\n", sizeof(enum sex));
  12. printf("%d\n", sizeof(s));
  13. return 0;
  14. }

运行截图:

结论:无论是枚举类型的大小,还是枚举类型的变量的大小,在内存中都是占据4个字节。

4. 联合(共用体)

4.1 联合类型的定义

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

比如:

  1. //联合类型的声明
  2. union Un
  3. {
  4. char c;
  5. int i;
  6. };
  7. //联合变量的定义
  8. union Un un;
  9. //计算连个变量的大小
  10. printf("%d\n", sizeof(un));
  11. printf("%p\n",&un);
  12. printf("%p\n",&un.c);
  13. printf("%p\n",&un.i);

运行截图:

 4.2 联合的特点

4.2.1 特点阐述

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联 合至少得有能力保存最大的那个成员)。

4.2.2 特点应用----判断大小端

方法一:运用联合的方式

  1. #include<stdio.h>
  2. union S
  3. {
  4. int i;
  5. char ch;
  6. };
  7. int check_sys()
  8. {
  9. union S s;
  10. s.i = 1;
  11. return s.ch;
  12. }
  13. int main()
  14. {
  15. union S s;
  16. s.i = 1;
  17. int ret = check_sys();
  18. if (1 == ret)
  19. {
  20. printf("小端存储\n");
  21. }
  22. else
  23. {
  24. printf("大端存储\n");
  25. }
  26. return 0;
  27. }

方法二:运用非联合的方式

  1. #include<stdio.h>
  2. int check_sys()
  3. {
  4. int a = 1;
  5. return *(char*)&a;
  6. }
  7. int main()
  8. {
  9. int ret = check_sys();
  10. if (1 == ret)
  11. {
  12. printf("小端存储\n");
  13. }
  14. else
  15. {
  16. printf("大端存储\n");
  17. }
  18. return 0;
  19. }

4.3 联合大小的计算

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

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

简而言之就是大于成员变量最大空间数,且是最大对齐数的整数倍。

比如:

  1. union un
  2. {
  3. int a;//对齐数为4,默认对齐数为8,取较小值,即4
  4. char arr[5];//最大成员的大小为5,对齐数为1(拿char来算,而不是拿整个数组所占的内存空间来算),默认对齐数为8,取较小值1
  5. //所以联合体的最大对齐数为4,所以union un的内存空间的大小必须是4的倍数,同时还必须大于5,所以空间大小为8个字节
  6. };

相关文章