C语言系列-联合

 个人主页: 会编程的果子君
个人格言:“成为自己未来的主人~” 

 

目录

联合体

联合体类型的声明

联合体的特点

相同成员的结构体和联合体对比

联合体大小的计算

联合的一个练习


联合体

联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。

但是编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用一块内存空间,所以联合体也叫:共同体

给联合体其中一个成员赋值,其他成员的值也跟着变化

#include
//联合类型的声明
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	//计算变量的大小
	printf("%zd", sizeof(un));
	return 0;
}

为什么是4呢?

联合体的特点

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

#include
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un = { 0 };
	printf("%p\n", &(un.c));
	printf("%p\n", &(un.i));
	printf("%p\n", &un);
	return 0;
}

#include
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x", un.i);
	return 0;
}

代码1输出的三个地址一模一样,代码二的输出,我们发现将i的第四个字节的内容修改为55了

我们仔细分析就可以画出,un的内存布局图

C语言系列-联合_第1张图片

相同成员的结构体和联合体对比

我们再对比一下相同成员的结构体和联合体的内存布局情况

#include
struct s
{
	char c;
	int i;
};
union Un
{
	char c;
	int i;
};
int main()
{
	struct s s = { 0 };
	union Un un = { 0 };
	return 0;
}

 C语言系列-联合_第2张图片

联合体大小的计算

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

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

#include
union Un1
{
	char a[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union Un1));
	printf("%d\n", sizeof(union Un2));

	return 0;
}

C语言系列-联合_第3张图片

用联合体是可以节省空间的,举例:

如:我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品,图书,被子,衬衫

每一种商品都有:库存量,价格,商品类型和商品类型相关的其他信息

图书:书名,作者,页数

杯子:设计

衬衫:设计,可选颜色,可选尺寸

那我们不耐心思考,直接写出一下结构

struct gift_list
{
	//公共属性
	int stock_number;//库存量
	double price;//定价
	int item_type;//商品类型

	//特殊类型
	char title[20];//书名
	char author[20];//作者
	int num_page;//页数

	char design[30];//设计
	int colors;//颜色
	int sizes;//尺寸

};

上面的结构其实设计的很简单,用起来也很方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存,因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。比如:

商品是图书,就不需要design,colors,sizes

所以我们就可以把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存。

struct gift_list
{
	int stock_number;
	double price;
	int item_type;
	union {
		struct
		{
			char title[20];//书名
			char author[30];//作者
			int num_pages;//页数
		}book;
		struct
		{
			char desgn[30];//设计
		}mug;
		struct
		{
			char desgn[30];//设计
			int colors;//颜色
			int sizes;//尺寸
		}shirt;
	}item;
};

联合的一个练习

写一个程序,判断当前机器是大端?还是小端?


#include
int chack_eyes()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}
int main()
{
	int ret = chack_eyes();
	if (ret == 1)
	{
		printf("是小端");
	}
	else
		printf("是大端");
	return 0;
}

 

你可能感兴趣的:(c语言,开发语言)