一、共用体的特性
共用体又叫做联合体,共用体的特性如下:
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;
};