C语言复合类型之联合(union)篇

news/2024/11/24 13:27:06/

上篇介绍了C语言的一种复合类型——结构struct->C语言复合类型之结构(struct)篇(结构指针)

本篇总结一下另外一种复合结构或者说复合类型

  • 联合的含义
  • 联合的创建
  • 联合的使用
  • 匿名联合
  • 联合与结构的区别(union/struct)

联合的含义

联合(union)是一种数据结构,可以在同一块内存中存储不同的数据类型。

联合的创建

联合的创建与结构的创建很相似,创建结构的时候需要结构模板和结构变量,那么同样的创建联合的时候需要联合模板联合变量。上篇中介绍过了,结构模板与结构变量的创建可以合并,联合也是一样的。下面是带标记的联合创建:

union hold{int digit;double bigfl;char letter;
};
union hold dudu;
dudu.x = 2000;
print("%d",dudu.x);//2000

或(hold联合标记可以省略~)

union hold{int digit;double bigfl;char letter;
}dudu;
dudu.x = 2000;
print("%d",dudu.x);//2000

但是联合(union)与结构(struct)有很大的不同,如果将上面的形式声明成结构,则该结构可以储存一个int类型的值、一个double类型的值和一个char类型的值。到那时union不是,他只能存储一个值,一个一个int类型的值或一个double类型的值或一个char类型的值。一次只能存储一个值,即使有足够的空间也不能同时存储。
union hold fit;//hold类型的变量
union hold* pu;//指向hold类型变量的指针
联合与结构对于成员的访问是非常相似的,可以用点运算符(.)和->运算符。
pu = &fit;
x = pu->digit;就相当于x = fit.digit;

联合的使用

联合的主要使用方法场合:与结构相结合,表达一种具有从属关系的信息,也是为了能够避免代码重复,提供代码的简洁性。相同成员公用,差异成员则通过 union 区分,这就避免了代码重复,也避免了代码耦合
假设我们要对一段小短片进行信息描述,那么我们可以将它分为视频和音频两个部分。

视频部分包含:

1.短片名称 char* name;
2.短片地址:char* addr;
3.视频格式:char* formate;
4.视频帧率:int frame;
使用结构表示:

struct video_info{char* name;char* addr;char* formate;int frame;
};

音频部分包含:

1.短片名称 char* name;
2.短片地址:char* addr;
3.音频采样率:int frequency;
4.音频通道数:int channel;

struct audio_info{char* name;char* addr;int frequency;int channel;
};

如此一来我们便可以通过创建结构变量去描述视频与音频信息了。
struct video_info vi;
struct audio_info au;

但是由上面视频和音频的包含信息可知,短片名称和地址是重复的,这个时候我们可以将相同成员公用,差异成员用union来处理。这样既能避免代码的重复,也能避免耦合。这也是union 在C语言中的重要用法。
视频:

struct video_info{char* formate;int frame;
};

音频:

struct audio_info{int frequency;int channel;
};

短片:

struct av_info{char* name;char* addr;union {struct video_info vinfo;//视频struct audio_info ainfo;//音频};
}av;

如此一来,访问视频的格式和帧率可用:
av.vinfo.formate;
av.vinfo.frame;
访问音频的采样频率和通道数可用:
av.ainfo.frequency;
av.ainfo.channel;

匿名联合

上面union的形式,便是一种匿名的联合结构。

union {struct video_info vinfo;//视频struct audio_info ainfo;//音频
};

联合与结构的区别(union/struct)

首先union和struct都是C语言中两种数据结构,是常用的复合结构,可以在一个结构中存储多种数据类型。
区别:
联合: 所有成员公用一块地址空间,也就是说所有的成员不能同时占用内存空间,即不能同时存在。所以一个联合体的长度等于其最长的成员长度
结构: 所有成员的内存占用是累加的,其不同成员会放在不同的地址上,而且一个结构体变量的长度等于所有成员长度之和


http://www.ppmy.cn/news/419065.html

相关文章

关于安装系统后不能启动的问题!

关于这个问题,以前在安装笔记本win7的时候遇到过,只是记住改变bios时改变硬盘模式就行了,并没有深究,其实也是自己的无知,只是知道在许多主板开始支持uefi时安装系统会出现这种情况。   前段时间安装一台旧笔记本&am…

打开VT方法教学

BIOS开启VT指南的方法如下: 一、进入BIOS 参考以下按键,开机时按住对应的键进入BIOS: 组装机以主板分,华硕按F8、Intel按F12,其他品牌按ESC、F11或F12。 笔记本以品牌分,联想ThinkPad系列按F1,其…

双流中学高2021年高考成绩查询,2020成都57所高中高考成绩大汇总,哪些学校考得好,家长心知肚明!...

高考哪些学校考得好? 升学情况又如何? 一直是择校的重要参考指标, 备受学生、家长关注! 那今年成都各中学高考成绩到底如何,小编结合学校公布的喜报、论坛家长分享、家委会及网络搜集的小道消息,对数据进行…

吴宗宪将续任翔升董事长 传为经营向黑道借债

12月2日早间消息,据台湾媒体报道,台湾综艺天王吴宗宪担任董事长的上市公司翔升电子今将召开临时股东会,虽然之前外界传言吴为了经营翔升,对外“借很多”,且股东间角力,恐怕会被赶下董事长宝座。但据透露&am…

热启动计算机的快捷键,电脑怎么设置U盘启动 各品牌电脑热启动快捷键大全-电脑教程...

当我们将U盘制作成启动U盘,并将系统镜像放入U盘中之后,接下来将启动U盘插入需要安装系统的电脑,然后就需要设置电脑开机从U盘启动来完成系统安装。电脑怎么设置U盘启动?这是不少小白用户所不太了解的。下面小编为大家准备了一些主…

建筑工程机械设备管理措施

在现代化建筑施工中设备的作用已日益突出,施工设备的现场管理在施工企业中也越来越受到重视。随着工程施工的发展,抢速度、保质量、要效益,三者之间的矛盾也日益突出,这就对工程施工提出了新的要求。本章分析了机械设备管理现状&a…

Elasticsearch:实用 BM25 - 第 2 部分:BM25 算法及其变量

BM25算法 我将尽可能深入这里的数学以解释正在发生的事情,但这是我们查看 BM25 公式的结构以深入了解正在发生的事情的部分。 首先我们来看看公式,然后我将把每个组件分解成可以理解的部分: 我们可以看到一些常见的组件,如 qi、I…

Go 切片Slice的长度len与容量cap

0x00 简介 Go 语言之旅示例 切片的长度与容量 切片拥有长度和容量。 切片的长度是它所包含的元素个数。 切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。 切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取。 package main import &qu…