文件名称:
从零开始学C语言(七).pdf.pdf
开发工具:
文件大小: 7mb
下载次数: 0
上传时间: 2019-09-13
详细说明:从零开始学C语言(七).pdfpdf,从零开始学C语言(七).pdf第16章共用体
共用体又称为联合体,它和结构体一样,也是一种由用户自己定义的数据类型,它也
由若干个成员数据组成。其成员的数据类型可以是相同的,也可以是不同的。共用体与结
构体的不同之处在于共用体的所有成员都占用相同的内存。使用共用体可以节省内存。
口共用体类型定义;
口共用体类型变量、数组和指针变量的定义;
口共用体类型变量、数组和指针变量的引用;
口共用体应用举例;
口用 typedef定义数据类型,
6)共用体类型定义
由于不同的共用体可以有不同的成员,因此共用体也需要用户在程序中根据自己的需要自
定义。定义共用体之后,就可以使用这种数据类型。
1611定义共用体
所谓共用体类型,是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单
元。由于不同的共用体类型的数据可以有不同的成员,因此共用体也是需要用户在程序中自定
义的一种数据类型。共用体的定义格式如下
union共用体名
数据类型1成员1名
数据类型2成员2名
数据类型n成员n名
其中,共用体名是用户为标记共用体而取的标识符,它的定义符合标识符的定义规则。数
据类型1~数据类型n是共用体中的成员的数据类型,通常是基本数据类型,也可以是结构体类
型,或是已经定义过的共用体类型等。成员名1~成员名n也是用户自己取的标识符,用来标识
所包含的成员名称。
这个定义语句的功能是定义了一个名为“共用型名”的共用体,该共用体中含有n个成员,
每个成员都有确定的数据类型和名称。
【实例16-1】共用体定义。
union data
int a i
float b:
double ci
char d;
}
该形式定义了一个名为data的共用体数据类型。其一共有四个成员,第一个成员为a,数
54-从零开始学c语會
-=-=------===+-+-=---+++=--=-=-+========-================================
据类型为整型:第二个成员为b,数据类型为单精度浮点型;第三个成员为c,数据类型为双精
度浮点型;第四个成员为d,数据类型为字符型。
在定义共用体时,需要注意以下几点
(1)共用体定义最后的分号不能省略。
(2)共用体的成员在定义时是不分配内存的,只有定义了该共用型的变量、数组或指针变
量后,才会给该变量、数组和指针变量分配内存。
16.1.2共用体的存储
从【实例16-1】中可以看出,共用体数据类型与结构体在形式上非常相似,但两者有本质
上的不同。在结构体中各成员有各自的内存空间,一个结构体变量的总长度是各成员长度之和。
而共用体中,各成员共享一段内存空间,一个共用体变量的长度等于各成员中最长的长度。
实际上,共用体共享存储空间不是把多个成员同时装入一个共用体变量内,而是指该共用
体变量可以被赋予任一成员值,每次只能赋一种值,赋入新值取代旧值。
【实例16-2】共用体与结构体数据存储的比较。
排 inc lude< stdio,h>
union data
/*共用体*
int ai
float bi
double C:
char d:
struct stud
/*结构体*
Int ai
float bi
double Ci
char d:
void main(
printf(" struct stud的存储空间大小为:");
printf("器dn”, sizeof( struct stud)
printf(" union data的存储空间大小为:·);
A printf("sd\n", sizeof(union data))
运行程序运行的结果为:
struct stud的存储空间大小为:17
union data的存储空间大小为:8
对于结构体 struct stud和共用体 union data,它们都包含四个成员变量,第一个成员为a,数
据类型为整型,在内存中占有4个字节:第二个成员为b,数据类型为单精度浮点型,在内存占
用4个字节;第三个成员为c,数据类型为双精度浮点型,在内存中占有8个字节:第四个成员
为d,数据类型为字符型,在内存中占用1个字节。
程序输出的结果说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结
构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间
对于共用体,做以下几点说明:
(1)共用体只有定义了该共用型的变量、数组或指针变量后,才会给该变量、数组和指针
变量分配内存。
(2)同一个内存可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而
第16章共用体255
=====--==+===-+==-+-=--==========-==========--==--=--=----
不是同时存放几种。也就是说,每一瞬时只有一个成员起作用,其他的成员不起作用,即不是
同时存在和起作用。
(3)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成
员就失去作用。
(4)共用体变量的地址和它的各成员的地址都是同一地址。
(5)不能对共用体变量名赋值,不能试图引用变量名来得到一个值,也不能在定义共用体
变量时对它初始化。
(6)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共
用体变量的指针。
(7)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也
可以出现在共用体类型定义中,数组成可以作为共用体的成员。
162)共用体类型变量、数组和指针变量的定义
定义了共用体之后,就可以用这种数据类型来定义相应的变量、数组及指针变量等。共用
体变量、数组和指针变量的定义和一般的变量、数组和指针变量的定义方法相同,唯一需要注
意的是“数据类型符”必须是用户自己定义的公用体,即“ union共用体名”。
共用体变量、数组和指针变量的定义与结构体变量、数组及指针变量的定义方法相同。分
为三种:第一种是先定义共用体,再定义共用体变量、数组及指针变量;第二种是定义共用体
的同时定义共用体变量、数组及指针变量;第三种是定义共用体的同时定义共用体变量、数组
及指针变量,但省略共用体名。
16.2.1先定义共用体,再定义共用体变量、数组及指针变量
其定义格式如下:
union共用体名
数据类型1成员1名;
数据类型2成员2名;
数据类型n成员n名;
union共用体名变量名,共用体数组名[数组长度],*共用体指针变量名;
例如:
union share
nt classno:
char address【20];
union share a, b[51,*p;
定义一个含有两个成员变量的共用体。定义共用体之后,定义了一个共用体变量a,定义了
一个共用体数组b5],数组的长度为5,还定义了一个共用体指针变量p
1622定义共用体的同时定义共用体变量、数组及指针变量
这种方式的定义如下
256]从零开始学C语冒
union共用体名
数据类型1成员1名;
数据类型2成员2名;
数据类型n成员n名;
}变量名,共用体数组名[数组长度],*共用体指针变量名;
例如:
union share
int classno
char address [20]:
}a,b[5],*
格式与结构体相似。使用这种方法定义以后还可以使用“ union share”定义这种共用体的其
他变量、数组及指针变量等
1623定义共用体变量、数组及指针变量时省略共用体名
这种格式其实跟第二种格式相似,只是把共用体名省略了。格式如下:
union
[
数据类型1成员1名;
数据类型2成员2名;
数据类型n成员n名;
}变量名,共用体数组名数组长度],*共用体指针变量名;
例如;
union share
int classno;
char address [20]
}a,b[5],*p;
使用这种方法,以后将不能再定义这种共用体的其他变量、数组及指针变量等。
(6.3共用体类型变量、数组和指针变量的引用
共用体和结构体相似,在使用共用体变量、数组元素及指针变量时,分为几种情况。下面
我们以一个共用体为例进行详细说明。
union
int classno
char address [20]:
a,b[5],+p;
(1)用共用体变量引用其成员,引用格式如下:
共用体变量名成员名
例如:
a classno
使用共用体变量a引用共用体 share中的整型成员 classno
a address[51
第16章共用体
257
一------------------------------=--====--=-=============-=====-----+----=-
使用共用体变量a引用共用体 share中的字符数组 address的第6个元素。
【实例16-3】对共用体变量的引用。
#includexstdio, h>
union data
*定义共用体
data*/
lnt a
float b:
double c
char d;
Fmm:
/*同时定义共用体变量*/
void main(
mm a=2
/*给共用体成员a赋值*/
printf("gd\n",mm. a)i
mm.C=2.2;
/*给共用体成员c赋值*
printf("5. 11f\n", mm.c)
mm, d='WIi
/*给共用体成员a赋值*
mm.b=34.2;
/*给共用体成员b赋值*
printf("85.1f, &c\n",mm. b, mm. d)
程序的运行结果为
2
2.2
34.2,?
共用体一次只能对一个成员赋值,当先对d赋值,又对b赋值以后,共用体只有成员b覆
盖了成员d,因此运行的结果d是一个“?”表明它的值不存在。
(2)用共用体数组元素来引用其成员,引用格式如下:
共用体数组名[下标].成员名
例如:
b[o. classno
表示共用体数组第一个元素的 classno成员。
(3)共用体指针变量引用该共用体的变量或数组,格式如下:
共用体指针变量=共用体变量名
共用体指针变量=共用体数组名[下标]
共用体指针变量=共用体数组名
例如:
p=&a;
让共用体指针变量指向共用体变量a。
p=&b[1]
让共用体指针变量指向共用体数组的第2个元素。
p=b:
让共用体指针变量指向共用体数组的首地址。
(4)使用共用体指针变量引用共用体的成员,引用格式如下:
共用型指针变量).成员名
共用型指针变量->成员名
例如:
258
从零开始学C语胃
(*p), classno
p->classno
【实例164】共用体指针变量的使用。
#include cstdio. h>
union ks
/*定义共用体ks*
Int:
*整型成员a*/
int bi
/*整型成员b*
union ks S[4
*定义共用体数组*
union ks *pi
/*定义共用体指针变量*
oid main()
int n=1, i
for(i=0;i<4;i++)
s[],a=n;
s【i],b=s[i].a+1;
n=n+2;
}
&s[0];
printf(“8d",p->a);
printf("8d",++p->a)
程序的运行结果为:
(164共用体应用举例
我们知道共用体的一个内存可以用来存放几种不同类型的成员,但每次只能存放其中一种,
而不是同时几种。共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后,
原有的成员就失去作用了。
【实例16-5】共用体成员的存储。
#inc ludecstdio. h>
void main()
union data
char c
Int1
float f:
ai
printf("这个共用体的长度为:d", sizeof( union data));
a C=B
/*为成员c赋值*
printf("c=8cn”,a,c)
a.f=15.96;
/*为成员f赋值
printf("f=8”,a,f)
a,i=0x2341;
/*为成员i赋值*
printf("c=8C,i=悬d,f=8f”,a,C,a,i,a.f);
程序运行的结果为:
这个共用体的长度为:4
第16章共用体259
f=15.960000
c=A,i=9025,f=0.000000
共用体变量存储空间的大小等于各成员中存储空间最长的成员占用长度。字符类型占有1个
字节,整型占有4个字节,单精度浮点型占有4个字节,因此,这个共用体占有空间的长度为4
在程序中我们对共用体的成员c赋值为字符“B',但是最后输出的竟是字符‘A’,对共用
体成员中的f赋值为1596,但最后输出的结果却是000000这说明该空间的存储内容发生了
变化。此存储空间内存储的内容为整型i的值。
由于整型和字符型是可以通用的,将整型i的值以字符的形式输出时,字符只有一个字节,
只将整型的后8位输出,即0x41,将其转换成十进制为65,正是字符“A’的ACSⅡ码值。
另外,共用体中可以出现结构体类型的定义,结构体也可以出现共用体类型的定义。
【实例166】设有若干个成员的数据,其中有教师和学生。学生的数据包括号码、姓名、
性别、职业、班级。教师数据包括号码、姓名、职业、职务。教师和学生的数据是不同的,现
要求把它们放在同一张表格中,如表16-1所示。
表16-1人员信息表
号码(m)姓名(mme)性别(sx)职业(b)班级(caso),职务( position)
wumen
1005
lutao
prof
要求输入人员的数据,然后再输出。
编程思想:
(1)要用同一个表格来表示学生和教师,需要定义一个共用体使学生的班级和教师的职称
共用一个存储空间。
union
nt classno;
char position [10]:
Typer
(2)这是一个学生信息或教师信息的集合,需要定义一个结构体,内部成员有号码、姓名、
性别、职业,还有表示学生班级或者教师职称的共用体。
struct
int norm
char name [10];
char sex
char job
nion other tp:
};
3)输入时,循环输入人员的号码、姓名、性别、职业,然后对职业进行判断,如果职业
是学生,就输入学生的班级,如果职业是教师,就输入教师的职称,否则输出错误提示。
(4)输出时,循环输出人员的号码、姓名、性别、职业,然后对职业进行判断,如果职业
是学生,就输出学生的号码、姓名、性别、职业和班级:如果职业是教师,就输出教师的学生
的号码、姓名、性别、职业和职称
根据上面的分析,程序设计如下:
#includesstdio. h>
struct
/*结构体*
260
从零开始学c语冒
int num;
/*定义号码*
char name [10]:
/*定义姓名*
char sex
/*定义性别*
char job;
定义职业*
unl on
/*共用体*
int classno:
/*成员为班级*
char position [10]:
/*成员为职称*
)type
)person [2]:
v° id main()
int 1;
for(i=0;i<2;i++)
scanf("a,各c,8C,影曰”, person[],nm, person[i],sex, person[i],job, person[i],name)
if(person[i]. job=='s)
scanf ("bd", &person [i] type classno);
else if(person[i]. job==t')
scanf("%s, person[1]. type position);
els
printf("error!" )i
printf("\n"):
printf("No--Name--sex--job--classno/position\n");
for(i=0;1<2;1++)
if(person [i]. job=='s
printf("暑-6d8-10s号-6c8-6c8-6d\n”, person[主].num, person[i].name,
person [i]. sex, person[i]. job, person[i] type classno);
else
printf("8-6d8-10s3-3c8-3c8-6s\n", person [i]. num, person[i] name,
person[il. sex, person[il job, person[i] type position);
程序运行的结果如图16-1所示
正变结作程程序与h
16.5)枚举类型
在实际问题中,有些变量的取值被限定在一个有
限的范围内。例如,一个星期有7天,一年有12个月,
图16-1程序运行结果
一个班每周有6门课程等。把这些量说明为整型、字符型或其他类型显然是不妥当的。为此,C
语言提供了一种称为“枚举”的类型。
1651枚举类型的定义
枚举类型定义的一般形式为:
enum枚举名
〔枚举值表};
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.