什么是“自定义数据类型”?顾名思义,就是用户能够随时在程序中自行定义新的数据类型。自定义数据类型时须要设置数据类型的名称及其成员。数据类型成员各属性的设置方法等同于变量设置时相应属性的设置方法。数组
1、什么是联合体?学习
在C语言中,变量的定义是分配存储空间的过程。通常的,每一个变量都具备其独有的存储空间,那么可不能够在同一个内存空间中存储不一样的数据类型(不是同时存储)呢?spa
联合体能够作到。联合体也叫共用体,在C语言中定义联合体的关键字是union,它是C语言中的一种特殊的数据类型。定义union下面的成员变量共享一块内存,每个成员在任一时刻有且只有一个成员使用此块内存。共同体是会按照成员中最大的一个数据长度分配空间,它的本质就是同一块内存的不一样形式的访问。3d
定义一个联合类型的通常形式为:对象
union联合名blog
{内存
成员表资源
};开发
union 的用途之一是将一种较长的基本类型与由其它比较小的数据类型组成的结构(structure)或数组(array)联合使用,例如:get
union mix_t{
long l;
struct {
short hi;
short lo;
} s;
char c[4];
} mix;
以上例子中定义了3个名称:mix.l, mix.s 和 mix.c,咱们能够经过这3个名字来访问同一段4 bytes长的内存空间。至于使用哪个名字来访问,取决于咱们想使用什么数据类型,是long, short 仍是 char 。下图显示了在这个联合(union)中各个元素在内存中的的可能结构,以及咱们如何经过不一样的数据类型进行访问:
匿名联合(Anonymous union)
在 C++ 咱们能够选择使联合(union)匿名。若是咱们将一个union包括在一个结构(structure)的定义中,而且不赋予它object名称 (就是跟在花括号{}后面的名字),这个union就是匿名的。这种状况下咱们能够直接使用union中元素的名字来访问该元素,而不须要再在前面加 union对象的名称。在下面的例子中,咱们能够看到这两种表达方式在使用上的区别:
以上两种定义的惟一区别在于左边的定义中咱们给了union一个名字price,而在右边的定义中咱们没给。在使用时的区别是当咱们想访问一个对象(object)的元素dollars 和yens 时,在前一种定义的状况下,须要使用:
book.price.dollars
book.price.yens
而在后面一种定义下,咱们直接使用:
book.dollars
book.yens
再一次提醒,由于这是一个联合(union),域dollars 和yens 占据的是同一块内存空间,因此它们不能被用来存储两个不一样的值。也就是你能够使用一个dollars 或yens的价格,但不能同时使用二者。
看完你会发现,联合体和结构体有类似之处,也有不一样之处。
结构体和联合体的区别在于:结构体的各个成员会占用不一样的内存,互相之间没有影响;而联合体的全部成员占用同一段内存,修改一个成员会影响其他全部成员。
结构体占用的内存大于等于全部成员占用的内存的总和(成员之间可能会存在缝隙),联合体占用的内存等于最长的成员占用的内存。联合体使用了内存覆盖技术,同一时刻只能保存一个成员的值,若是对新的成员赋值,就会把原来成员的值覆盖掉。
若是你对C/C++感兴趣,想要深刻学习,这里有一个交流群推荐给你。
群内含有素材包,初学者入门学习资源,还有项目开发免费课程。更有牛人、大牛在线为你解答专业知识,为你在学习的道路上助力~
不管是小白仍是进阶者,在这里都能得到成长。