C语言学习第11篇---union enum, sizeof, typedef 分析

举报
CodeAllen 发表于 2021/10/30 00:53:45 2021/10/30
【摘要】 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取   union相关总结 定义联合体 uniontest {    intoffice;    charteacher...

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取

 

union相关总结

定义联合体


  
  1. uniontest
  2. {
  3.     intoffice;
  4.     charteacher[5];
  5. };
  6. uniontestb;

从这可以看出来,联合体内存是共享的,也就是只看那部分占用内存最大则联合体占用就是该内存

相应的缺点就是操作office就会改变teacher的前四个字节的值

 

根据这个特性,可以有一个妙用!


  
  1. uniontest
  2. {
  3.      unsignedcharODR;
  4.     struct
  5.     {
  6.           unsignedcharbit0:1,
  7.                         bit1:1,
  8.                         bit2:1,
  9.                         bit3:1,
  10.                         bit4:1,
  11.                         bit5:1,
  12.                         bit6:1,
  13.                         bit7:1;
  14.     };
  15. };
  16. uniontestc;

这里联合体有两个成员,一个char ODR,还有一个8位的结构体,因为内存共享,这么着操作后边的结构体就可以改变ODR

例如c.ODR = 0XFF,或者c.bit0 = 1:

这就可以对ODR进行每一位进行赋值了


第二个作用就是节约内存,在内存比较小的单片机内经常使用

在STM8里定义

uint8_t flag1=0;

uint8_t flag2=0;

uint8_t flag3=0;

…………

这么每一个flag会占用一个字节的ram空间

要是使用union会节约空间


  
  1. union uflag
  2. {
  3.      unsignedcharflag;
  4.     struct
  5.     {
  6.           unsignedcharflag0:1,
  7.                         flag1:1,
  8.                         flag2:1,
  9.                         flag3:1,
  10.                         flag4:1,
  11.                         flag5:1,
  12.                         flag6:1,
  13.                         flag7:1;
  14.     };
  15. };
  16. union uflag flg;

 

这么每个flag占用1bit,8个才占一个字节


union的三种说明方式,基本与结构体一样


  
  1. 1
  2. uniontest
  3. {
  4.    intnum;
  5.    charstudent[4];
  6. };
  7. union testa,b;    //
  8. 2
  9. uniontest
  10. {
  11.    intnum;
  12.    charstudent[4];
  13. }a,b;                //
  14. 3
  15. union
  16. {
  17.    intnum;
  18.    charstudent[4];
  19. }a,b;               //

 

enum : 枚举

是C语言中的一种自定义类型

值是可以根据需要自己定义的整型值

第一个定义的enum值默认是0

默认情况下的enum值是在前一个定义值得基础上加1

enum类型的变量只能取定义时的离散值

 

enum中定义的值是C语言中真正意义上的常量

在工程中enum多用于定义整型常量

 

实验一:enum的使用


  
  1. #include <stdio.h>
  2. enum
  3. {
  4. ARRAY_SIZE = 10
  5. };
  6. enum Color
  7. {
  8. RED = 0x00FF0000,
  9. GREEN = 0x0000FF00,
  10. BLUE = 0x000000FF
  11. };
  12. void PrintColor(enum Color c)
  13. {
  14. switch( c )
  15. {
  16. case RED:
  17. printf("Color: RED (0x%08X)\n", c);
  18. break;
  19. case GREEN:
  20. printf("Color: GREEN (0x%08X)\n", c);
  21. break;
  22. case BLUE:
  23. printf("Color: BLUE(0x%08X)\n", c);
  24. break;
  25. }
  26. }
  27. void InitArray(int array[])
  28. {
  29. int i = 0;
  30. for(i=0; i<ARRAY_SIZE; i++)
  31. {
  32. array[i] = i + 1;
  33. }
  34. }
  35. void PrintArray(int array[])
  36. {
  37. int i = 0;
  38. for(i=0; i<ARRAY_SIZE; i++)
  39. {
  40. printf("%d\n", array[i]);
  41. }
  42. }
  43. int main()
  44. {
  45. enum Color c = GREEN;
  46. int array[ARRAY_SIZE] = {0};
  47. PrintColor(c);
  48. InitArray(array);
  49. PrintArray(array);
  50. return 0;
  51. }

 

sizeof :

sizeof是编译器的内置指示符

sizeof用于计算类型或变量所占的内存大小

sizeof的值在编译器就已经确定

 

用于类型:  sizeof(type)

用于变量: sizeof(var)或sizeof var

 

注意:

sizeof 是C语言的内置关键字而不是函数

- 在编译过程中所有的sizeof将被具有的数值所替换

- 程序的执行过程与sizeof没有任何关系

 

实验2:sizeof的本质


  
  1. #include <stdio.h>
  2. int f()
  3. {
  4. printf("Delphi Tang\n");
  5. return 0;
  6. }
  7. int main()
  8. {
  9. int var = 0;
  10. int size = sizeof(var++);
  11. printf("var = %d, size = %d\n", var, size);
  12. size = sizeof(f());
  13. printf("size = %d\n", size);
  14. return 0;
  15. }

 

typedef:面试的时候可能被问到哦

用于给一个已经存在的数据类型重命名

本质上不能产生新的类型

重命名的类型:

- 可以在type语句之后定义

- 不能被unsigned 和 signed 修饰

       typedef type new_name

 

实验3:typedef使用实例


  
  1. #include <stdio.h>
  2. typedef int Int32;
  3. struct _tag_point
  4. {
  5. int x;
  6. int y;
  7. };
  8. typedef struct _tag_point Point;
  9. typedef struct
  10. {
  11. int length;
  12. int array[];
  13. } SoftArray;
  14. typedef struct _tag_list_node ListNode;
  15. struct _tag_list_node
  16. {
  17. ListNode* next;
  18. };
  19. int main()
  20. {
  21. Int32 i = -100; // int
  22. //unsigned Int32 ii = 0;
  23. Point p; // struct _tag_point
  24. SoftArray* sa = NULL;
  25. ListNode* node = NULL; // struct _tag_list_node*
  26. return 0;
  27. }

 

小结:

enum用于定义离散值类型

enum定义的值是真正意义上的常量

sizeof是编译器的内置指示符

sizeof不参与程序的执行过程

typedef用于给类型重命名

 - 重命名的类型可以在typedef语句之后定义

 

 

 

 

 

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/79120027

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。