一、共用体的特性
共用体又叫做联合体,共用体的特性如下:
1.共用体的所有成员共用一段内存空间,且所有成员的起始位置是一致的
2.共用体的值由最后赋值的成员决定
3.共用体的内存大小
- 共用体的内存必须大于或等于其他成员变量中最大数据类型(含数组)的大小。
- 共用体的内存必须是最宽基本数据类型的整数倍,如果不是,则填充字节。
二、共用体的用途1(判断大小端)
#include <stdio.h>
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 <stdio.h>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 <stdio.h>
#include <stdlib.h>#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(类型转换)
union Converter {int i;float f;
};// 使用共用体进行类型转换
union Converter conv;
conv.f = 3.14;
int intValue = conv.i;
六、共用体的用途5(处理特定硬件寄存器)
union Register {unsigned int reg;struct {unsigned int bit0: 1;unsigned int bit1: 1;unsigned int bit2: 1;unsigned int bit3: 1;unsigned int reserved: 28;} bits;
};