struct与union的基本⽤法
结构体与联合体是C语⾔的常见数据类型,可对C的基本数据类型进⾏组合使之能表⽰复杂的数据结构,意义深远,是优异代码的必备⼯具。
⼀.        struct与 union的基本⽤法,在语法上union与struct相同,因此只以struct为例
1.1        基本⽤法:
01. struct AA{ int a; int b;}; //结构体的声明和定义
02. struct AA s1; //变量的声明和定义
03. s1.a=3; //变量的使⽤:
复制代码
1.2        在声明结构体的同时定义变量:
01. struct AA{int a; int b}s2={1, 2}; //此处AA为可选项,初始化部分为可选
02. s2.a=5;                //变量的使⽤
复制代码
1.3        使⽤ typedef 来简化struct的类型说明:
01. typedef struct AA{int a; int b;}SAA;
02. SAA s3, s4;        //变量的声明和定义
03. 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标准中提及的匿名结构(联合)体应该只
适⽤于有名结构体(联合)中的匿名结构(联合)体成员)
union是什么类型
01. struct v{
02.        union{ //匿名联合体
03.                struct {int i, j;}; //匿名结构体
04.                struct {long k, l;}w;
05.        };
06.        int m;
07. }v1;
08. v1.i=2; //合法,匿名结构体的成员被直接使⽤
09. v1.k=3;//⾮法,有名字的结构体需要引⽤他的名字,如下
10. v1.w.k=5; //合法