admin管理员组

文章数量:1794759

小代老师带你深入理解联合体

1联合体

学习联合体之前让我们对比下 结构体,枚举,联合体的关键字

结构体:struct 枚举:enum 联合体:union

1.1联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所 以联合体也叫:共⽤体。 给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

为什么是输出8,4呢?

1.2 联合体的特点

联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合 ⾄少得有能⼒保存最⼤的那个成员)。 我们再打印下他们的地址

代码1输出的三个地址⼀模⼀样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。 我们仔细分析就可以画出,un的内存布局图

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

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

代码语言:javascript代码运行次数:0运行复制
struct str
{
	char name;
	int n;
};
union  un
{
	char name;
	int n;
};
union  un n1 = { 0 };
struct str n2={0};

1.4 联合体⼤⼩的计算

• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。 • 当最⼤成员大小不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
union Un1
{
 char c[5]; //5   1 8 1 
 int i;//         4 8 4
};
union Un2
{
 short c[7];    //  2  8  2
 int i;        //   4  8  4
};
int main()
{
 //下⾯输出的结果是什么?
 printf("%d\n", sizeof(union Un1));
 printf("%d\n", sizeof(union Un2));
 return 0;
}

使⽤联合体是可以节省空间的,举例: ⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。 图书:书名、作者、⻚数 杯⼦:设计 衬衫:设计、可选颜⾊、可选尺⼨ 那我们不耐⼼思考,直接写出⼀下结构:

代码语言:javascript代码运行次数:0运行复制
#include<stdio.h>
int main()
{
	struct  gift_list
	{
		//公共属性
		int stock_member;
		double price;
		int item_type;
		//特殊属性
		char title[20];
		char author[20];
		int num_pages;
		char design[30];
		int  colors;
		int  sizes;

	};
	return 0;
}

上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样 使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息 是常⽤的。⽐如: 商品是图书,就不需要design、colors、sizes。 所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以 介绍所需的内存空间,⼀定程度上节省了内存。

代码语言:javascript代码运行次数:0运行复制
struct  gift_list
{
	//公共属性
	int stock_member;
	double price;
	int item_type;
	union s1
	{
		char title[20];
		char author[20];
		int num_pages;
	 };book
	union s2
	{
		char design[30];
		int  colors;
		int  sizes;
	};shirt
	union s3
	{
		char design[30];
	};mug
	//特殊属性
	char title[20];
	char author[20];
	int num_pages;
	char design[30];
	int  colors;
	int  sizes;

};

1.5 联合的⼀个练习

写⼀个程序,判断当前机器是⼤端?还是⼩端?

代码语言:javascript代码运行次数:0运行复制
#include<stdio.h>
int main()
{
	union s1
	{
		char a;
		int b;
	}n1;
	n1.b= 1;
	if (n1.a == 1)
	{
		printf("小端");
	}
	else
		printf("大端");
  
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-06-09,如有侵权请联系 cloudcommunity@tencent 删除charint布局内存设计

本文标签: 小代老师带你深入理解联合体