任务三union共用体
任务描述
关于构造体类型我们已经学过了数组和结构体那么就只有共用体还没有学了。本任务就是来学习共用体这一类型,本任务会对共用体进行详细的讲解。
学习目标
掌握共用体类型的声明。
掌握共用体变量的定义。
掌握共用体变量的引用和初始化。
相关知识
10-3-1 共用体的声明
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。共用体类型同结构体类型一样,都属于构造类型,并且它的声明结构体类型十分相似,声明格式如下:
union 共用体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
……
数据类型 成员名n;
};
在上述语法结构中,“union”是定义结构体类型的关键字,接下来是共用体类型名称,用作共用体类型类型的标志,它又称 共用体类型标记,大括号内是该结构体中的各个成员,由它们组成一个共用体类型,对各成员都应进行类型声明如:数据类型 成员名;
数据类型一般是基本数据类型、也可以是数组、指针、 结构体或是共用体,成员名命名规则写法同变量名都是标识符。接下来我们通过一个案例来深入了解共用体是如何声明的。
实例10- 9 声明的共用体。
union Data
{ int i;
float f;
char ch;
};
上述代码定义了一个Data共用体,该共用体有三个类型组成,这些数据共享一块数据。
10-3-2 共用体变量的声明
共用体变量的声明和结构体变量形式一致,也提供三种方式具体如下。
方式一 先定义共用体,然后再创建共用体变量
格式如下:
union 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
…
数据类型 成员名n;
};
union 共用体名 变量名;
例如:
union Data
{ int i;
float f;
char ch;
};
union Data data1,data2; //声明变量
方式二 在定义共用体的同时定义共用体变量
格式如下:
union 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
…
数据类型 成员名n;
} 结构体名体变量名列表;
如:
union Data
{ int i;
float f;
char ch;
}data1,data2; //声明变量
方式三 直接定义结构体变量
格式如下
union
{
数据类型 成员名1;
数据类型 成员名2;
…
数据类型 成员名n;
} 共用体变量名列表;
例
如果只需要 data1,data2一个变量,后面不需要再使用共用体数据类型,
union
{ int i;
float f;
char ch;
}data1,data2;//声明变量
上述都实现对共同体变量实现了定义,声明变量之后肯定会在内存中占领一席之地的,以第一种方式为例,它由三个成员组成,分别是int类型变量a,浮点类型变量f,以及字符类型变量ch,他们三个会共用一块内存,系统会按照最长的成员分配内存,最长的是浮点类型和int类型在内存中都占4个字节,所以共用体的内存空间也是4个字节。通过sizeof(data1)获取的内存大小也确实是4,如图10-16所示。
图10- 16 获取共用体的内存大小
接下来我通过10-16来知晓data1如是实现内存分配如图10-17所示。
图10- 17 共用体的内存分配
共用体和结构体的定义以及变量声明的形式一致,但是它们的作用和含义却不相同。结构变量中的每个成员分别占有独立的存储空间,因此结构变量所占内存字节数是包含成员所占字节数的总和;而共用体变量中的所有成员共享一段公共存储区,所以共用体变量所占内存字节数与其成员中占字节数最多的那个成员相等。
10-3-3 共用体初始化和引用
1.共用体如何初始化
由于共用体变量中的所有成员共享存储空间,因此变量中的所有成员的首地址相同,而且变量的地址也就是该变量成员的地址,所以共用体变量在定义的同时只能用第一个成员的类型的值进行初始化。其初始化格式如下:
union 共用体类型名 共用体变量={第一个成员的类型值}
例如:union Data data1={23};
2.共用体如何引用
数据初始化之后就可以引用成员了,引用方式有三种,与结构体的形式一致
1. 共用体变量名.成员名。
2. 共用体指针变量名->成员名。
3. (*共用体指针变量名).成员名。
当然形式二和形式三必须声明共用体指针变量,声明方式与结构体类似。
在访问共用体变量成员时,共用体变量仅有驻留一个成员,原有成员变量的值将被覆盖。
接下来我们通过一个案例来证实一下。
实例10- 10共用体变量仅有驻留一个成员的证实。
#include <stdio.h>
union Data
{
int a;
int b;
};
int main( )
{
union Data data;
printf("对共用体的成员a进行赋值\n");
data.a = 100;
printf( "data.a的值 : %d\n", data.a);
printf("对共用体的成员b进行赋值\n");
data.b = 22;
printf( "data.a的值 : %d\n", data.a);
printf( "data.b的值 : %d\n", data.b);
printf( "data.a的地址值 : %p\n", &data.a);
printf( "data.b的地址值 : %p\n", &data.b);
getchar();
return 0;
}
运行结果如图所示 10-18所示。
图10- 18 实例 10-10运行的结果
上述代码定义了一个Data类型的共用体变量data,其中包含了a和b同类型的变量,当将a赋值为100时,之后把b赋值为22,a的值会将之前b的值覆盖,最终a和b的值都为22。从图中还可以看到成员是共享的同一块内存。