提起结构体,我们可以想到它的一些特性,定义一个结构体,我们可以给其中放上不同类型的数据,他们分别占用不同的存储空间,所以一个结构体的数据所占内存就是各个数据的内存之和,这里还涉及到了内存对齐的问题,我在专门写结构体的那篇博客里面已经说过了,这里就不在赘述了。其实,还有一个和结构体很相似的内存类型,共用体。
一看到它的名字,我们或许就已经知道一些 它的特性了,没错,它和结构体很相像,也可以在其中放入不同类型的数据,但是,有一个不同的地方就是,在共用体当中的数据共用这一段内存空间,所以,他们的存储地址都是相同并且固定不变的,刚刚接触到这个概念,其实我也很是迷惑,这到底应该如何存放数据呢,如果放进去三个数据甚至更多,这么大的数据内存空间更本就不够用啊,直到我更深入的了解到这个类型时,我才发觉到,共用体的设计真是太巧妙了,我在下面讲一讲我的理解吧。
共用体确实是占用同一段内存空间,但是需要知道的是,整个内存空间必须是占用内存最大的数据的空间大小,这样才能保证数据可以正确的放在里面而不至于数据丢失。
假设定义一个共用体如下
共用体的几个特点
一看到它的名字,我们或许就已经知道一些 它的特性了,没错,它和结构体很相像,也可以在其中放入不同类型的数据,但是,有一个不同的地方就是,在共用体当中的数据共用这一段内存空间,所以,他们的存储地址都是相同并且固定不变的,刚刚接触到这个概念,其实我也很是迷惑,这到底应该如何存放数据呢,如果放进去三个数据甚至更多,这么大的数据内存空间更本就不够用啊,直到我更深入的了解到这个类型时,我才发觉到,共用体的设计真是太巧妙了,我在下面讲一讲我的理解吧。
共用体确实是占用同一段内存空间,但是需要知道的是,整个内存空间必须是占用内存最大的数据的空间大小,这样才能保证数据可以正确的放在里面而不至于数据丢失。
假设定义一个共用体如下
union
{
int i;
char ch;
float f;
}a,b,c;
共用体的几个特点
1.共用体总是存储最后一个数据的值,因为在共用体中每一瞬间只能存放其中一个成员,而不是同时存放几个。为什么会是这样呢,浅显的说,在每一个存储的瞬间,存储单元只能有唯一的内容,在共用体变量中只能存一个值,所以可以说是共用体存在内存覆盖,不管有多少个数据,只会存放最后一个元素的值,原有的值会被取代。
2.由于共用体的第一个性质,所以对共用体进行初始化的时候,在初始化表中只能有一个变量,我在下面举几个例子
2.由于共用体的第一个性质,所以对共用体进行初始化的时候,在初始化表中只能有一个变量,我在下面举几个例子
union Data
{
int i;
char ch;
float f;
}a={1,'a',1.5}; //错了,占用同一段存储单元
union Data a={16}; //正确,对第一个成员进行初始化
union Data a={.ch='j'}; //可以对指定的成员进行初始化
3.不能对共用体进行赋值,也不能通过引用变量名来得到一个值
举两个错误的例子
1.a=1 这样不知道给哪一个赋值,所以错了
2.m=a 不能通过引用变量名得到一个值赋给整型变量m
但是,可以对两个同类型的共用体进行赋值
比如 a=b; 这样是完全可以的,这一点又和结构体有异曲同工之妙
特别注意
只有先定义了共用体变量才可以引用它,但是,不能引用共用体变量,只能引用共用体变量中的成员
a.i (引用共用体变量中的整型变量i)
a.ch (引用共用体变量中的字符变量ch)
a.f (引用共用体变量中的实型变量f)
举两个错误的例子
1.a=1 这样不知道给哪一个赋值,所以错了
2.m=a 不能通过引用变量名得到一个值赋给整型变量m
但是,可以对两个同类型的共用体进行赋值
比如 a=b; 这样是完全可以的,这一点又和结构体有异曲同工之妙
特别注意
只有先定义了共用体变量才可以引用它,但是,不能引用共用体变量,只能引用共用体变量中的成员
a.i (引用共用体变量中的整型变量i)
a.ch (引用共用体变量中的字符变量ch)
a.f (引用共用体变量中的实型变量f)