联合(共用体)
联合类型的定义联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。
联合体内的成员不是每一个都有独立的空间存在共用空间(合租);结构体每个成员有自己独立的空间;
比如:
union Un
{
int a;
char c;
};
//共用
struct st
{
int a;
char c;
};
int main()
{
union Un u;
struct st s;
printf("%d\n", sizeof(u));//4
printf("%d\n", sizeof(s));//5
printf("%p\n", &u);
printf( "%p\n", &(u.a));
printf("%p\n",&(u.c));
return 0;
}
打印三个关于联合体的地址可以发现的是三个地址都一样;说明a,c用的是同一块空间;
a用的时候c不能用,c用的时候a不能用;只需要做好这一点就行(类似于共享单车)
用完之后我换回去别人也能用;但是不能两个人同时扫到一辆车上;
改变a的值时,变相改掉了c的值;
int main()
{
union Un u;
u.a = 0x11223344;
u.c = 0x00;
}
一定程度上节省了空间;
联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
可以用联合体来判断编译器是大端存储还是小端存储;
通常:
#include<stdio.h>
int main()
{
int a=1;
char* p=(char*)&a;
printf("%d",*p);
}
如果*p=1就是小端存储(数据的低位置存放在内存的低地址);
如果*p=0就是小端存储(数据的低位置存放在内存的高地址);
联合体判断:
#include<stdio.h>
int main()
{
union
{
int a;
char c;
}u;//这里我们只需要定义一个联合体变量所以可以用匿名联合体;(与结构体类似)
u.a=1;
if(u.c==1)
{
printf("小端存储\n");
}
else if(u.c==0)
{
printf("大端存储\n");
}
}
联合体大小的计算
不是所有的联合体大小都是最大成员的大小;
结构体存在内存对齐,联合体也存在内存对齐;
联合体的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
union Un
{
char arr[5];//5 字符数组形式存储时按照char类型对齐,对齐数是1;
int i;//4
};
/*联合体大小是最大对齐数的倍数;最大对齐数是4;联合体大小至少是最大成员的大小5;
所以4只能翻倍成8; 给变量开辟8个字节的空间但是它只是用了前5个后3个字节依然属于它只是没有使用*/
int main()
{
printf("%d \n", sizeof(union Un));// 8;
return 0;
}
union Un
{
short arr[7];//14
int i;//4
};
int main()
{
printf("%d\n", sizeof(union Un));// 16;
return 0;
}
最大对齐数*n直到至少可以装下最大成员;
自定义类型学习结束;