前言
这期我们来跟着笔者学习一下联合体相关知识,相信聪明的你一定会有所收获!
提示:以下是本篇文章正文内容,下面案例可供参考
一、联合(共用体)定义
联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体。
代码如下(示例):
#include<stdio.h> union 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.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
举例说明:
#include<stdio.h> union 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特点及运用全面讲解教程的详细内容,更多关于C语言联合体Union教程的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/m0_57180439/article/details/120417270