C语言联合体类型的实现
一,什么是联合体
联合体也称共用体
像结构体一样,联合体也是由一个或者多个成员构成,这些成员的类型可以不同。但是,与结构体不同的是:联合体的所有成员共用一块内存空间。(即:给联合体其中的一个成员赋值,其他成员的值也会跟着被改变)
二,联合体的声明
1,联合体类型的声明
C语言中联合体类型的定义形式:
union 联合体名 { 成员项表列 };
例如:
(我们定义一个同时由char和int型构成的联合体)
union Un { char c; int i; }; (注意:分号不能丢)
2,联合体变量的创建
同结构体变量的创建类似,我们可以在声明联合体类型的同时创建变量;也可以在声明后,再创建变量
如:
(1)先声明联合体类型,再创建变量
#include<stdio.h> union Un { char c; int i; }; union Un u1;
(2)在声明联合体类型的同时创建变量
union Un { char c; int i; }u1;
对联合体成员的引用也与对结构体成员的引用相同
三,联合体的特点
1,联合体与结构体的对比
联合体的大部分与结构体相似,其独特之处就是所有成员共用一块内存空间
例如,我们看拥有相同成员的结构体和联合体对比:
对于s1 和 u1的内存分配情况应该是:
我们可以用sizeof
算一算,看看结果:
运行下面代码:
int main() { printf("%d\n", sizeof(s1)); printf("%d\n", sizeof(u1)); return 0; }
输出:
可以发现:和我们上面的分析一样
2,对联合体成员进行改变
下面我们就对联合体u1
中的成员c
进行赋值,然后再打印成员i
#include<stdio.h> union Un { char c; int i; }u1; int main() { u1.c = 1; printf("%d", u1.i); return 0; }
运行结果:
可见:尽管没有给成员i
赋值,但是随着成员c
被修改成员i
的值也发生了变化
四,联合体的大小
上面提到的联合体u1
的大小是4,刚好是当中最大的int
类型的大小,难道联合体的大小就是其中最大成员的大小吗?
答案是:错误的
因为联合体的大小也要满足是最大对齐数的整数倍
⭐换句话来说,联合体的大小要满足以下两个条件:
1,大于或等于最大的成员(至少要能装下最大的成员)
2,同时是最大对齐数的整数倍
对于上面的u1
:
最大成员:int
类型的大小是4
而int
的最大对齐数也是4,所以联合体u1
的大小是4
再看下面的代码(多加一个字符数组):
#include<stdio.h> union Un { char c; int i; char arr[6]; }u1; int main() { u1.c = 1; printf("%d",sizeof(u1)); return 0; }
运行结果:
这是因为:
1,最大成员char arr[6]
的大小是6
2,最大对齐数是4
6不是4的倍数,所以扩宽到8,所以联合体的大小是8
到此这篇关于C语言联合体类型的实现的文章就介绍到这了,更多相关C语言联合体类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
基于WTL 双缓冲(double buffer)绘图的分析详解
本篇文章是对WTL下使用双缓冲(double buffer)绘图进行了详细的分析介绍,需要的朋友参考下2013-05-05
最新评论