当前位置:首页 > c语言基础教程 第九章 联合和枚举
C语言基础教程 9.1.1 联合变量的定义和赋值
联合变量定义的形式与结构很相似,除关键字不同,其余几乎相同。下面是一个联合模式的定义格式: union(联合名) {
(联合成员说明); };
其中,union是联合的关键字。(联合名)的命名方法同标识符,<联合成员说明》是将组成该联合的所有成员进行类型说明。C:语言中,几乎所有类型都作为联合的成员,包含结构变量在内。
联合变量的定义如下所示: union<联合名)(联合变量名表);
定义一个联合变量之前要先定义一种联合模式,任何一种联合变量都是属于某种联合模 式的联合变量,这一点与结构变量很相似。<联合变量名表)中,可以是一个联合变量名,也可是多个联合变量名,多个变量用逗号分隔。这里的变量可以是一般联合变量,也可以是指向联合变量的指针。例如: union date {
Char c_data; int idata; float f._data; double d_data; };
union data dl,d2.*pd.
其中,anion是关键字,data是联合名,该联合有4个成员,分别作了说明dl和d2是两个联合变量,pd是一个指向联合变量的指针。联合变量dl和d2都是具有联合名data的联合变量。而联合变量指针pd也是指向具有data联合名的联合变量的指针。 与结构相类似,上述定义联合变量也可以写成如下形式: union data {
char c_data; int i _data;
float f_data; double d_data; }d1,d2,*pd;
这里,也同样定义了联合变量dl和d2以及指向联合变量的指针pd。
联合变量的成员表示也与结构相似。联合变量的成员用\·\表示,指向联合变量的指针用\一>\表示。
联合变量的赋值主要是给联合变量的各成员赋值。例如,在上例中,对联合变量dl的几个成员赋值分别如下: dl.c_data='a'; dl.i_data=15; dl.f_data=10.5; dl.b_data=87.63;
对指向联合变量的指针pd赋值与给联合变量赋值相同,只是其成员表示不同。例如,给pd的最后一个成员赋值如下: Pd一>d_data =97.0
由于联合变量中的若干个成员共用内存单元,即一个联合变量的所有成员具有一个相同 的内存地址值,因此,在联合变量中起作用的成员是最近一次被赋值的成员,因为一个联合变量的若干个成员共用一个内存地址,存入了新的成员值时,原来的成员值便失去意义。 如果给联合变量赋初值,只能有一个值,并且指定斌给第一个成员,而不能用多个值赋给多个成员,其原因是由于联合变量所有成员共占一个内存地址。
C语言基础教程 9.1.2联合与结构的区别
前面对联合变量的定义和联合变量成员的表示以及对联合变量的赋值作了描述,可以看出联合与结构有许多相似之处,但是也指出了两者的最大区别在于联合是共址的,结构是异址的。即联合的所有成员共同使用一个内存地址,而结构的每个成员都有自己的内存地址。 由于联合的共址特性使得它与结构产生了很大差别。例如,在斌初值时,联合变量只能给第一个成员赋初值;不能对联合变量名赋值;不能用联合变量作函数参数,也不能用联合变量作函数的返回值,只能用指向联合变量的指针作函数参数。 下面举出两个例子说明联合变量的使用和特点。
[例9.1] 分析下列程序的输出结果,进而说明联合变量的成员是共址的。
uninn data {
char c_data; int i_data; float f_data; }; main() {
unian data dl; d1.c_data='a'; dl.i_data=5; d1.f_data=3.7;
printf (\ printf(\
printf(\ }
执行该程序输出结果如下: ? ? 3.7(?表示无意义) 4
FFD6 FFD6 FFD6 FFD6 说明:
(1)该程序中,首先定义一个联合,其名为data,它有3个成员,分别是三种不同类型。又定义联合变量d3,并给它的三个成员分别赋值。当使用printf ( )函数输出dl的三个成员的值时,前两个成员输出值是无意义的,只有最后一个成员是有意义的,其值为3. 7.这说明:某一时刻一个联合变量中只有一个成员起作用,其他成员不起作用。 (2)输出,SizeoE(dl )的值为4,这说明联合变量d1占内存4个字节。在多个联合成员共占一个内存地址时,该地址所指向的内存空间是所有成员中占内存空间最大的成员所占的内存空间。该例中的三个成员所占内存字节数分别为1.2和4,最大的是4,因此,联合变量dl所占内存空间为4个字节。
(3)使用printf ( )函数分别输出联合变量dl的三个成员的内存地址都是相同的,并且与联合变量dl的地址值也是相同的,可见联合变量各成员是共址的。 [例9. 2] 分析下列程序的输出结果,并指出该结果说明了什么间题。
main() {
union{
int ig[6],
char s[12]; }try;
try. ig[0]=0x4542; try. ig[1]=0x2049; try. ig[2]=Ox494a; try. igt3]=0x474e; try. ig[4]=Ox0a21; try. ig[5]=0x0000:
prints(\,
执行该程序输出如下结果: BEI JING
说明:该程序中定义一个无名联合,用它定义一个联合变量try,该联合有2个成员,每个成员都占内存12个字节。程序中对try的ig成员斌了值,ig是一个int型数组,分别对它的6个元素都赋了值。然后,程序中通过try的另一个成员。进行输出,所输出的字符串正是try的成员所被赋值的ASCII码所对应的字符组成的。由此可见,联合变量各个成员是共内存单元的,因此。按某个成员赋的值,可按其另一个成员进行输出,但要求输出的类型与效据类型相一致。
C语言基础教程 9. 2 联合的应用
由联合的特征决定了它的应用远不如结构应用那样广泛。但是。在有些情况下也使用联合来解决问题。在实际应用中,常常会出现一些虽相互间排斥的情况,这时用联合就十分方便。例如,假定某学校一些学生在校内住宿,另一些学生在校外住宿。对于在校内和在校外住宿的学生的住址描述是不同的,可分别用下述两种结构来描述:
struct off__school {
int strnucm
char strnamet[20]; char city(20]; }
struct in school {
char collname[lO]; char dorm[l0]; int roomnum; };
共分享92篇相关文档