一、共用体的特性
共用体又叫做联合体,共用体的特性如下:
1.共用体的所有成员共用一段内存空间,且所有成员的起始位置是一致的
2.共用体的值由最后赋值的成员决定
3.共用体的内存大小
- 共用体的内存必须大于或等于其他成员变量中最大数据类型(含数组)的大小。
- 共用体的内存必须是最宽基本数据类型的整数倍,如果不是,则填充字节。
二、共用体的用途1(判断大小端)
#include union myunion { int a; char b;};int main(){ union myunion test; test.a = 0x12345678; if (test.b == 0x78)printf("小端模式"); else if (test.b == 0x12)printf("大端模式"); return 0;}
三、共用体的用途2(给GPIO赋值)
/* 用途2: 给成员集体赋值*/#include struct GPIO{unsigned short Pin0 :1;unsigned short Pin1 :1;unsigned short Pin2 :1;unsigned short Pin3 :1;unsigned short Pin4 :1;unsigned short Pin5 :1;unsigned short Pin6 :1;unsigned short Pin7 :1;unsigned short Pin8 :1;unsigned short Pin9 :1;unsigned short Pin10 :1;unsigned short Pin11 :1;unsigned short Pin12 :1;unsigned short Pin13 :1;unsigned short Pin14 :1;unsigned short Pin15 :1;};union IODevice{unsigned short gpiovalue;struct GPIO gpiox;};int main(){union IODevice IO;IO.gpiovalue=0xff;printf("%d\n",IO.gpiox.Pin0);}
四、共用体的用途3
#include #include #define TOTAL 4//人员总数struct{char name[20];int num;char sex;char profession;union{float score;char course[20];} sc;} bodys[TOTAL];int main(){int i;//输入人员信息for(i=0; i<TOTAL; i++){printf("Input info: ");scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession));if(bodys[i].profession == 's'){//如果是学生scanf("%f", &bodys[i].sc.score);}else{//如果是老师scanf("%s", bodys[i].sc.course);}fflush(stdin);}//输出人员信息printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");for(i=0; i<TOTAL; i++){if(bodys[i].profession == 's'){//如果是学生printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score);}else{//如果是老师printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course);}}return 0;}
五、共用体的用途4(类型转换)
unionConverter{inti;floatf;};//使用共用体进行类型转换unionConverterconv;conv.f=3.14;intintValue=conv.i;
六、共用体的用途5(处理特定硬件寄存器)
unionRegister{unsignedintreg;struct{unsignedintbit0:1;unsignedintbit1:1;unsignedintbit2:1;unsignedintbit3:1;unsignedintreserved:28;}bits;};