联合

194 阅读2分钟

联合(共用体)

4.1联合类型的定义

联合也是一种特殊的自定义类型

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体,下面是一个栗子:

#include<stdio.h>
union Un
{
	int a;//4
	char c;//1
};
struct St
{
	int a;
	char c;
};
int main()
{
	union Un u;
	printf("%d\n", sizeof(u));
    	printf("%p\n", &u);
	printf("%p\n", &(u.a));
	printf("%p\n", &(u.c));
	return 0;
}

联合的结果.png

为什么会是相同的地址呢?

a与c共用同一块空间

请看直观图:

联合的直观图.png

而结构体则是两个独立的空间,直观图:

结构体的直观图2.png

更形象地说,联合的a与c合租同一个房间,睡在同一张床上,而结构体的a和c有独立的房间,并且还有公共区域(浪费的空间)

但是a和c不是同时使用,只能使用a或者c当中的一个

形象地说a与c都使用过同一辆共享单车,但是不会同时使用,a用,c不会用;c用,a不会用

4.2联合的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

//判断当前计算机的大小端存储
int check_sys()
{
	int a = 1;
	return *(char*)&a;
}
//之前学过的方法
int main()
{
	//int a=1;//0x 00 00 00 01
	//低---->高
	//01 00 00 00---小端
	//00 00 00 01---大端
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
}
//使用联合的方法
int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;

}

联合用来判断大小端的结果.png

4.3联合大小的计算

1.联合的大小至少是最大成员的大小

2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

举个栗子:

union Un
{
	char arr[5];//5,对齐数为1
	int i;//4
};
int main()
{
	printf("%d\n", sizeof(union Un));
	return 0;
}

联合的对齐方式.png

联合大小的直观图.png