C程序设计结构体、联合体与枚举类型_第1页
C程序设计结构体、联合体与枚举类型_第2页
C程序设计结构体、联合体与枚举类型_第3页
C程序设计结构体、联合体与枚举类型_第4页
C程序设计结构体、联合体与枚举类型_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第11章结构体、联合体与枚举类型 结构体类型是C语言允许用户定义的又一重要的构造数据类型。 11.1 结构体的概念11.2 结构体数组11.3 结构体指针11.4 链 表11.5 联合体数据类型11.6 枚举数据类型11.7 自定义类型 11.1 结构体的概念 结构体类型是一种构造数据类型,是数目固定,类型不同的若干有序数据项的集合。每个数据项称为一个成员。每一个成员可以是一个基本数据类型或者是一个构造类型。结构体数据类型具有很强的数据描述能力,但C语言中并不提供现成的结构体类型。因此,用户在使用一个结构体类型之前,必须先定义它,也就是要在程序中构造所需要的数据类型。11.1.1 结构体类型的

2、定义结构体类型定义的一般形式为:struct 结构体类型名 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n;;例如,定义一个“学生信息”的结构体类型如下:struct student int num; char name10; char sex; int age; char addr50; int score;11.1.2 结构体变量的定义、引用、初始化1结构体变量的定义(1)先定义结构体类型,再定义结构体类型变量。这种定义的一般形式为:struct 结构体类型名 结构体变量名表;如上面定义了“学生信息”的结构体类型struct student后,就可以用它来定义结构体变

3、量。例如:struct student stul,stu2;定义了stul和stu2为struct student类型的变量,编译系统为变量 stul与stu2分配存储空间时,其存储格式与结构体类型struct student所描述的保持一致,结构体中的各个成员按要求顺序存放。每一个struct student类型的变量占用的存储单元为67个字节。(2)在定义结构体类型的同时定义结构体变量。这种定义的一般形式为:struct 结构体类型名 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n; 结构体变量名表; 例如:struct student int num; char n

4、ame10; char sex; int age; char addr50; int score; stu1,stu2;这种定义与前面的定义功能相同,都是既定义了结构体类型struct student,又定义了两个结构体变量stu1与stu2。(3)直接定义结构体类型的变量。其一般形式为:struct 类型标识符 成员名1; 类型标识符 成员名2; 类型标识符 成员名n; 结构体变量名表;例如:struct int num; char name10; char sex; int age; char addr50; int score; stu1,stu2;2结构体变量的引用结构体成员引用的一般

5、形式如下: 其中“.”为结构体成员运算符,所有C语言运算符中它的优先级最高,因此可以把上述引用形式作为一个整体来看待。 例如, 、分别表示结构体变量stu1的成员name与结构体变量stu2的成员score。 例 定义有关职工工资信息的结构体类型变量(包括编号、姓名、基本工资、附加工资、水电费、实发工资),为结构体变量中的成员赋值并输出其值。struct person int num; /* 职工编号*/ char *name; /* 姓名 */ float base; /* 基本工资*/ float addition; /* 附加工资*/ float cost; /* 水电

6、费*/ float salary; /* 实发工资*/ ; main() struct person employeea,employeeb; employeea.num=2086; =Zhao xiwang; printf(input base,addition,cost:n); scanf(f,f,f, &employeea.base, &employeea.addition, &employeea.cost); employeea.salary=employeea.base+employeea.addition-employeea.cost; employee

7、b=employeea; printf(Number=dnName=sn, employeeb.num, );. printf(Base=.2fnAddition=.2f n,employeeb.base, employeeb.addition); printf(Cost=.2fnSalary=.2fn, employeeb.cost, employeeb.salary);程序运行结果为:input base,addition,cost:805.85,376.57,123.52Number=2086Name= Zhao xiwang3结构体变量的初始化 结构体变量的

8、初始化和对数组的初始化相类似。将各个成员的初值用一对花括弧括起来,括弧内各数据项的数据类型、顺序要和结构体类型说明中的成员类型相匹配,数据项间用逗号分隔。如果初值的个数少于结构中成员的个数,则余下的成员将自动初始化为0或NULL。例如:struct student int num; char name10; char sex; int age; char addr50; int score;main( ) struct student stu=1422,Lin Hui,M,18,Shang Hai,85; printf(Number=dnName=snSex=cn,stu.num,stu.na

9、me,stu.sex); printf(Age=dnAddress=snScore=dn,stu.age,stu.addr,stu.score);程序运行结果为:Number=1422Name=Lin HuiSex=MAge=18Address=Shang HaiScore=8511.1.3 结构体的嵌套 结构体类型定义时,其成员的类型也可以是结构体类型,即结构体类型定义是可以嵌套的。结构体定义的嵌套可以是多重的。 例如,定义一个“职工信息”的结构体类型。每个职工包含编号(num)、姓名(name)、性别(sex)、出生日期(birthday)、家庭住址(addr)等信息。其中出生日期包括年(

10、year)、月(month)、日(day)3个数据项,家庭住址包括城市(city)、街道(street)、门牌号码(streetnum)等信息。职工信息的逻辑结构如图11.3所示。图11.3 职工信息逻辑结构 显然“职工信息”中的“出生日期”和“家庭住址”应该用结构体类型描述,首先定义结构体类型“日期”struct date和“住址”struct address如下。struct date int year; /*年 */ int month; /*月 */ int day; /*日 */;struct address char city50; /*城市*/ char street50; /*

11、街道*/ int streetnum; /*门牌号码*/;然后定义结构体类型“职工”struct employee如下。struct employee int num; char name10; char sex; struct date birthday; struct address addr; 在结构体类型struct employee中,成员birthday是struct date结构体类型,它又有自己的成员year、month、day,成员addr是 struct address结构体类型,它又有自己的成员city、street、streetnum,这就是结构体类型的嵌套定义。 对于

12、嵌套的结构体,引用时应按照从左到右,从外到内的方式,用“”一级一级地运算,直到找到最低一级的成员。例如:struct employee emp;emp.num=1001;strcpy(,Liu Xiaomei);emp.sex=F;emp.birthday.year=1986;emp.birthday.month=5;emp.birthday.day=18;strcpy(emp.addr.city,Bei Jing);strcpy(emp.addr.street,Changan street);emp.addr.streetnum=168; 定义了struct employee

13、类型的变量emp,对其各个成员赋值。赋值后结构体变量emp在内存中的存储形式如图11.4所示。图11.4 结构体变量emp11.2 结构体数组11.2.1 结构体数组的定义 结构体数组的定义方法与其他整型数组、实型数组和字符型数组的定义方法类似。例如:struct student int num; char name10; char sex; int age; char addr50; int score; ;struct student stu40; 与结构体变量的定义类似,结构体数组的定义也可以采用以下的方式:struct student int num; char name10; cha

14、r sex; int age; char addr50; int score; stu40;或struct int num; char name10; char sex; int age; char addr50; int score; stu40;11.2.2 结构体数组的引用例 输入全班的学生的信息(包括学号、姓名、性别、年龄、成绩和家庭住址),并按成绩由高到低的次序排序,输出排序后的全班学生信息登记表。struct student int num; char name10; char sex; int age; char addr50; int score; ;main() struct

15、 student stu40,temp; int i,j,k; for(i=0;i40;i+) printf(n学号:); scanf ( d, &stui.num); printf(n姓名:); scanf (s, ); printf(n性别:); scanf ( c, &stui.sex); printf(n年龄:); scanf ( d, &stui.age); printf(n家庭住址:); scanf (s, stui.addr); printf(n成绩:); scanf ( d, &stui.score); for(i=0;i39;i+) k=i; for(j=i

16、+1;j40;j+) if(stuk.scorestuj.score) k=j; temp=stui; stui=stuk; stuk=temp; printf(n学号t姓名t性别t年龄t家庭住址t成绩n); for(i=0;i”来访问结构体成员,一般形式为: 结构体指针变量-成员名例如:pstu-num=6001;例 编一程序,利用结构体指针处理结构体中的成员。struct student int num; char name10; char sex; int age; char addr50; int score; ;main() struct student stu= 6001,Zhao

17、 zhen ,F,18,Beijing,85,*pstu; pstu=& stu; printf(Number=d, Name =s, Sex=cn ,stu.num, , stu.sex); printf(Age=d, Address =s, Score =dn,stu.age,stu.addr,stu.score); printf(Number=d, Name =s, Sex=cn ,(*pstu).num, (*pstu).name, (*pstu).sex); printf(Age=d, Address =s, Score =dn,(*pstu).age, (*pstu

18、).addr, (*pstu).score); printf(Number=d, Name =s, Sex=cn ,pstu-num, pstu-name, pstu-sex); printf(Age=d, Address =s, Score =dn, pstu-age, pstu-addr, pstu-score);程序运行结果为:Number=6001, Name =Zhao zhen, Sex=FAge=18, Address =Beijing, Score =85Number=6001, Name =Zhao zhen, Sex=FAge=18, Address =Beijing, S

19、core =85Number=6001, Name =Zhao zhen, Sex=FAge=18, Address =Beijing, Score =8511.3.2 指向结构体数组的指针 同前面讨论的指向数组的指针一样,结构体指针也可用于指向结构体数组。 结构体指针变量指向一个结构体数组,这时结构指针变量的值是整个结构体数组的首地址。结构体指针变量也可指向结构体数组中的一个元素,这时结构体指针变量的值是该结构体数组元素的地址。例 利用结构体指针变量输出结构体数组。图11.8 结构数组的指针11.3.3 结构体指针作函数参数 结构体变量作函数参数采取的是“单向值传递”方式,系统将实参结构体的

20、全部成员拷贝给被调用函数的形参。 例 编写程序,用结构体指针变量作函数参数,计算一组学生的平均成绩和不及格人数。struct student int num; char name10; int score; stu5= 6001,Zhao zhen ,85,6002, Lin ping ,57,6003,He fang,62, 6004,Zhou ming,87, 6005,Wang tao,48;main() struct student *ps; void aver(struct student *ps); ps=stu; aver(ps);void aver(struct student

21、 *ps) int c=0,i; float ave,sum=0; for(i=0;iscore; if(ps-score成员名例如:union udata u,*pu;pu=&u;则指针pu指向联合体变量u,通过指针pu可以访问u中的各个成员。例如:(*pu).i=23; 表示将23赋给pu指向的联合体变量的成员i,或者pu-i=23 以上两种方法的效果是一样的,但在使用指针访问联合体成员时,通常使用指向运算符“”访问联合体成员。 假设pu指向联合体变量,则下面3个语句的效果是一样的。u.i=23;等价于(*pu).i=23;等价于pu-i=23 联合体的特征决定了它的应用远不如结构体应用那

22、样广泛。但是实际应用中,常常会出现一些量相互排斥的情况,这时用联合体就非常方便。11.6 枚举数据类型11.6.1 枚举类型的定义 枚举类型通过枚举一系列有序的标识符来定义。枚举类型定义的一般格式为:enmu 枚举名枚举分量名1,枚举分量名2,枚举分量名n; 其中,enmu是定义枚举类型的关键字。枚举名遵循标识符命名规则,用于标识所定义的枚举类型。枚举分量也是一个合法的标识符,由用户根据需要自己确定,它们列出一个枚举变量可以具有的值,又称为枚举常量。枚举常量各自代表一个数值,因此它们之间有先后顺序,可以进行比较。例如:enum week sun ,mon,tue,wed,thu,fri,sut;定义了一个枚举类型enmu week,它由枚举常量sun 、mon、tue、wed、thu、fri和sut组成,即一个enmu week类型的枚举变量可以具有的值为sun 、mon、tue、wed、thu、fri和sut。 在C语言中,枚举类型中的枚举常量各自隐含一个int型值。在默认情况下,枚举常量的值从0开始,后一个总是比前一个大1。如在枚举类型week中,第

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论