C:20---联合/共用体(union)
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、定义
- 和结构体定义类似,只是把struct改为union
- 联合也可以使用typedef取别名
union person
{
char student;
char teacher;
int id;
};
typedef union person
{
char student;
char teacher;
int id;
}person,*p_person;
二、联合的特点
- 在同一时间点,联合只能存储一个值,并且所有的成员使用的都是这个存储的值
- 联合的所有成员指向于在同一内存空间中:如果一个改变所有都改变,但不能同时存储
- 联合的一个用法:设计一种表以存储即无规律,事先又不知道顺序的混合类型
联合体的大小
- 不论联合体都多少成员,其大小等于所有成员中占用空间最大的那个成员的大小
- 并且同时需要考虑内存的对齐补齐
- 相关演示案例可以参阅:
三、联合数组
- 功能:联合数组中的每个联合大小相等,可以存储各种数据类型
四、演示案例
typedef union person
{
char student;
char teacher;
int id;
}person;
printf("%d\n",sizeof(person));
typedef union person
{
char student;
char teacher;
int id;
}person;
int main()
{
person p1;
p1.student='c';
printf("%c\t%c\t%c\n",p1.student,p1.teacher,p1.id);
return 0;
}
- union是所有成员共同表示一个数据,如果更改了占位符,那么结果就会改变。例如:
printf("%c\t%c\t%d\n", p1.student, p1.teacher, p1.id);
五、验证联合的成员指向与同一内存地址
- 利用联合体证明内存的大小端:数值低位存储在内存的低地址,数值高位存储在内存的高地址
#include<stdio.h>
#include<string.h>
typedef union temp
{
char arr[4];
int num;
}temp;
int main()
{
temp p;
p.num=0x12345678;
for(int i=0;i<4;++i)
printf("0x%x\t",p.arr[i]);
printf("\n");
return 0;
}
typedef union temp
{
char arr[4];
int num;
}temp;
int main()
{
temp p;
p.num=0x12345678;
for(int i=0;i<4;++i)
printf("0x%x\t",p.arr[i]);
p.arr[1]=0x00;
printf("\n");
for(int j=0;j<4;++j)
printf("0x%x\t",p.arr[j]);
printf("\n");
return 0;
}