如何掌握C语言联合体Union特点及运用
这篇文章主要介绍"如何掌握C语言联合体Union特点及运用",在日常操作中,相信很多人在如何掌握C语言联合体Union特点及运用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何掌握C语言联合体Union特点及运用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一、联合(共用体)定义
联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体。
代码如下(示例):
#includeunion Un//联合类型的声明,union是联合体关键字{ char c;//1字节 int i;//4字节};int main(){ union Un u = {0}; printf("%d\n", sizeof(u)); printf("%p\n", &u); printf("%p\n", &(u.c));//u.c表示联合体的成员c,该引用方法类似结构体 printf("%p\n", &(u.i));}
打印结果如下:
由sizeof(u)我们知道这个联合体总计占4个字节,而联合体成员i是int类型的,它占了4个字节,另外一个c是char类型占了1个字节,两个一起占了4个字节。说明c和i必然有一处是共用一块空间的,再者有u本身和它的两个成员是一个地址如上图003EFA80,说明首地址是重合的,简易示图如下:
由于共用空间这种特点就导致了,你改变c,i也会随之改变。这里和结构体是完全不一样的,结构体成员相互独立,但联合体不一样,改一个,其他的也会改变。所以这里,在同一时间,你只能使用一个联合体成员,你使用c就不要用i,因为你c改变的时候,一定会影响到你i的使用,程序非常容易出问题。
二、联合的特点及运用
联合的成员是共用一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合)
我们再来看看联合体在解决判断内存存储是大端存储还是小端存储的优势
代码如下(示例):
union U{ char c; int i;}u;//联合体变量创建方法类比结构体int main(){ u.i = 1; //0x 00 00 00 01 //低地址-------->高地址 //01 00 00 00 小端存储 低位放低地址 //00 00 00 01 大端存储 低位放高地址 if (u.c == 1) { printf("小端"); } else { printf("大端"); }}
由于i和c是共用一块内存,我们创建了i之后只要判断1是在高地址还是低地址即可,又因为c是和i是一个地址(低),所以只要判断c里面放的是1还是0即可,非常的方便。
三、联合的大小计算
在计算联合体大小之前我们必须知道两个知识点:
1.联合的大小至少是最大成员的大小
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
举例说明:
#includeunion Un1{ char c[5];//1个char类型占1字节,5个占5字节 int i;//4字节};union Un2{ short c[7];//1个short类型占2字节,7个占14字节 int i;//4字节};int main(){ printf("%d\n", sizeof(union Un1));//打印8 printf("%d\n", sizeof(union Un2));//打印16}
Un1解释:
char创建一个大小为5的数组和放5个char类型的是一样道理,对齐数仍然是1
int类型的i自身大小4字节,默认对齐数8,对齐数是4。i和c两个最大的对齐数是4,而最大成员大小是数组c(5个字节),5不是4的倍数,我们需要对齐到最大对齐数的整数倍,也就是8(从5到8会浪费3个字节空间)
Un2解释:
short创建的c数组,我们同上可知其c对齐数是2,i对齐数是4,最大对齐数为4。最大成员大小也就是c数组大小为14,14并不是最大对齐数4的整数倍,14往上对齐到16,16是4的整数倍。
到此,关于"如何掌握C语言联合体Union特点及运用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!