当前位置:   article > 正文

C语言:结构体、联合体和枚举_结构体中可含有枚举吗

结构体中可含有枚举吗

​​​​结构体

  • 一种自定义类型
  1. struct Person {
  2. char gender;
  3. char name[15];
  4. int age;
  5. };

内存对齐

  • .平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  •  性能原因:为了提高效率: 读取一个数据的时候尽可能一次就读取完, 而不是多次, 也确保了读取数据的完整性. 如上面若不内存对齐,获取age需要读2次

结构体内存对齐的规则

  • 第一个成员在与结构体变量偏移量为0的地址处
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。                                              
  • 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

对齐数 = 编译器默认的一个对齐数与该成员大小的较小值. VS的默认值是8.

可以使用pragma pack()指令来设置默认对齐数

位段

  • 允许你按位对结构体的成员进行定义,指定它们所占用的位数

  1. struct bitfield_struct {
  2. type member_name : width;
  3. };
  4. struct bitfield_struct {
  5. unsigned int flag1 : 1; // 1位宽度
  6. unsigned int flag2 : 2; // 2位宽度
  7. unsigned int flag3 : 5; // 5位宽度
  8. };
  • 位段的宽度不能超过成员的数据类型的位数。
  • 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  • 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  • 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段

位段的优点

  • 节省空间

位段的缺点(不确定性)

  • int 位段被当成有符号数还是无符号数是不确定的。
  • 位段中最大位的数目不能确定(16位的机器, 32位的机器)
  • 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  • 当结构包含两个位段:位段A成员剩下的空间装不下位段B成员, 剩下的空间是否丢弃不确定

联合体/共用体

  • 在同一块内存空间中存储不同类型的数据。联合体中的各个成员共享同一块内存
  1. union union_name {
  2. member_type1 member_name1;
  3. member_type2 member_name2;
  4. // 可以有更多的成员
  5. };
  • 使用联合体去判断电脑是大端存储还是小端存储
  1. //1 : 小端 0: 大端
  2. int judge_sys()
  3. {
  4. union judge
  5. {
  6. int value;
  7. char arr[4];
  8. };
  9. union judge data;
  10. data.value = 1;
  11. return data.arr[0];
  12. }

枚举

        枚举:是一种用户定义的数据类型,用于定义一组命名的常量。枚举常量表示一组相关的离散取值,例如表示星期几、月份、状态等。

  1. enum Weekday {
  2. Monday, //0
  3. Tuesday, //1
  4. Wednesday, //2
  5. Thursday, //3
  6. Friday, //4
  7. Saturday, //5
  8. Sunday //6
  9. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/705695
推荐阅读
相关标签
  

闽ICP备14008679号