结构体与联合体是C语言的常见数据类型,可对C的基本数据类型进行组合使之能表示复杂的数据结构,意义深远,是优异代码的必备工具。
一.        struct与 union的基本用法,在语法上union与struct相同,因此只以struct为例
1.1        基本用法:

  • struct AA{ int a; int b;}; //结构体的声明和定义
  • struct AA s1; //变量的声明和定义 
  • s1.a=3; //变量的使用:
  • 复制代码

    1.2        在声明结构体的同时定义变量:

  • struct AA{int a; int b}s2={1, 2}; //此处AA为可选项,初始化部分为可选
  • s2.a=5;                 //变量的使用
  • 复制代码

    1.3        使用 typedef 来简化struct的类型说明:

  • typedef struct AA{int a; int b;}SAA; 
  • SAA s3, s4;         //变量的声明和定义
  • s3.a=8; //变量的使用
  • 复制代码

    1.4 使用时尤其注意后面的分号,必不可少;
    二.        struct 与 union的区别
    2.1 struct中的成员是按顺序依次排列,互相独立,在排列时引入了对齐问题(2.2);而union中的成员共用一块内存,起始地址都是相同的,即union中的成员是对同一地址的多个引用、对同一地址的多种表达方法。
    2.2 struct的对齐问题
    对齐问题即struct中每个成员起始地址的分配。为了可以快速访问到每个成员,(以EW430为例)编译器根据成员的类型放到合适的地址上,默认为2字节对齐。如:
    Struct AA{char c; int d;}aa;
    假设aa被分配在地址N上,并且N为偶数,则aa.c的地址为N,aa.d的地址为N+2,而N+1地址未使用被浪费了。
    对齐字节大小的指定:通过#pragma pack(n)来指定对齐字节的大小,n为某些常量(EW430中可取1,2,4,8,16),指定以n字节对齐。通常使用编译器默认的对齐大小最为适宜。如果指定对齐大小为1字节对齐,以上面的结构体变量aa为例,aa.c地址为N,aa.d地址为N+1,是个奇数地址,因为430在奇数地址只能读取一个字节,因此要访问d成员需要读取两次才能完成,后果是代码变长、速度变慢。
    三.        匿名结构体与联合体
    匿名结构体和联合体,即没有名字的结构体或者联合体,这种结构体(或联合体)无法通过.与->操作符引用(因为它所属的结构体或联合体没有名字,无法应用),而像暴露在外面一样,与外层作用域相同,可直接使用。
    3.1 C标准中提及的匿名结构体和联合体(草稿原文引用)(C标准中提及的匿名结构(联合)体应该只适用于有名结构体(联合)中的匿名结构(联合)体成员)

  • struct v{
  •         union{ //匿名联合体
  •                 struct {int i, j;}; //匿名结构体
  •                 struct {long k, l;}w;
  •         };
  •         int m;
  • }v1;
  • v1.i=2; //合法,匿名结构体的成员被直接使用
  • v1.k=3;//非法,有名字的结构体需要引用他的名字,如下
  • v1.w.k=5; //合法
  • 相关文章:

    • 2022-12-23
    • 2022-01-26
    • 2021-11-27
    • 2022-01-18
    • 2021-12-31
    猜你喜欢
    • 2021-10-23
    • 2022-12-23
    • 2021-07-20
    • 2021-07-24
    • 2021-11-12
    • 2022-01-16
    • 2022-12-23
    相关资源
    相似解决方案