上篇介绍了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语言中两种数据结构,是常用的复合结构,可以在一个结构中存储多种数据类型。
区别:
联合: 所有成员公用一块地址空间,也就是说所有的成员不能同时占用内存空间,即不能同时存在。所以一个联合体的长度等于其最长的成员长度。
结构: 所有成员的内存占用是累加的,其不同成员会放在不同的地址上,而且一个结构体变量的长度等于所有成员长度之和。