c语言学习c语言课件第09章.ppt
《c语言学习c语言课件第09章.ppt》由会员分享,可在线阅读,更多相关《c语言学习c语言课件第09章.ppt(56页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第9章结构体与共用体本章学习目标本章学习目标q掌握结构体类型的定义。掌握结构体类型的定义。q熟练掌握结构体变量的引用和初始化。熟练掌握结构体变量的引用和初始化。q掌握结构体数组的使用。掌握结构体数组的使用。q熟练掌握指向结构体类型的指针的使用。熟练掌握指向结构体类型的指针的使用。q掌握共用体数据类型的定义和引用。掌握共用体数据类型的定义和引用。q了解枚举类型和用了解枚举类型和用TYPEDEF定义类型。定义类型。Return9.1 结构体类型与结构体变量的定义 9.2 结构体变量的引用与初始化 9.3 结构体数组 9.4 指向结构体类型数据的指针 9.5 共用体 9.6 枚举类型 9.7 用ty
2、pedef定义类型 9.8 结构体应用举例 9.1 结构体类型与结构体变量的定义 9.1.1 结构体类型的定义结构体类型的定义 在生活中我们通常会在住宿表上登记姓名、性别、身份证号码等项目;在通讯地址表中记录姓名、邮编、邮箱地址、电话号码、E-mail等项目。这些表中集合了各种类型的数据,无法用前面学过的任一种简单数据类型完全描述,因此C引入一种能集中不同数据类型于一体的数据类型结构体类型。姓名(字符串)性别(字符)职业(字符串)年龄(整型)身份证号码(长整型或字符串)住宿表可由下面的项目构成:下面让我们分析一下住宿表、成绩表、通讯地址等数据的特点。成绩表可由下面的项目构成:班级(字符串)学号
3、(长整型)姓名(字符串)操作系统(实型)数据结构(实型)计算机网络(实型)姓名(字符串)工作单位(字符串)家庭住址(字符串)邮编(长整型)电话号码(字符串或长整型)通讯地址表可由下面的项目构成:E-mail(字符串)显然,这些登记表中包含多种不同数据类型的数据项,用简单类型的变量无法描述清楚。但可用C语言提供的结构体类型描述如下:/*住宿表结构*/struct accommodchar name20;/*姓名*/char sex;/*性别*/char job40;/*职业*/int age;/*年龄*/long number;/*身份证号码*/;/*成绩表结构*/struct score ch
4、ar grade20;/*班级*/long number;/*学号*/char name20;/*姓名*/float os;/*操作系统*/float datastru;/*数据结构*/float compnet;/*计算机网络*/;/*通讯地址表结构*/struct addr char name20;char department30;/*部门*/char address30;/*住址*/long box;/*邮编*/long phone;/*电话号码*/char email30;/*Email*/;像这些对不同登记表的数据结构的描述类型称为结构体类型 C语言对结构体类型定义的一般形式如下:
5、struct struct 结构体名结构体名 成员项表列成员项表列 ;/*此行分号不能少!*/有了结构体类型,我们就可以定义结构体类型变量,对不同变量的各成员进行引用。9.1.2 结构体类型变量的定义结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共计有3种形式,分别介绍如下:1.1.先定义结构体类型,再定义结构体类型变量:先定义结构体类型,再定义结构体类型变量:struct stu /*定义学生结构体类型*/char name20;/*学生姓名*/char sex;/*性别*/lo
6、ng num;/*学号*/float score3;/*三科考试成绩*/;struct stu student1,student2;/*定义结构体类型变量*/用此结构体类型,可以定义更多的该结构体类型变量。2.2.定义结构体类型同时定义结构体类型变量:定义结构体类型同时定义结构体类型变量:struct data int day;int month;int year;time1,time2;也可以再定义如下变量:struct data time3,time4;用此结构体类型,同样可以定义更多的该结构体类型变量。3.3.直接定义结构体类型变量:直接定义结构体类型变量:struct char nam
7、e20;/*学生姓名*/char sex;/*性别*/long num;/*学号*/float score3;/*三科考试成绩*/person1,person2;/*定义该结构体类型变量*/注意:注意:该定义方法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。关于结构体类型,有几点要说明:(1)类型与变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。(2)数据类型相同的数据项,既可逐个、逐行分别定义,也可合并成一行定义。例如,上面的日期结构类型,也可改为如下形式:struct da
8、te int year,month,day;(3)结构体中的成员,既可以是基本数据类型,也允许是另一个已经定义的结构类型。如:struct data int day;int month;int year;struct stu /*定义学生结构体类型*/char name20;/*学生姓名*/char sex;/*性别*/long num;/*学号*/struct data birthday;/*birthday是struct data类型*/float score3;/*三科考试成绩*/student1,student2;在stu结构中的birthday成员又是一个结构体(struct dat
9、a)类型的变量。(4)成员名可以与程序中的变量名相同,但二者不代表同一对象。9.2 结构体变量的引用与初始化 9.2.1 9.2.1 结构体类型变量的引用结构体类型变量的引用 引用结构体类型变量的一般形式为:引用结构体类型变量的一般形式为:结构体类型变量名结构体类型变量名.成员名成员名其中其中“.”“.”是是成员成员(分量分量)运算符运算符,它在所有运算符中优先级最高。,它在所有运算符中优先级最高。说明:说明:(1)(1)结构体类型变量的各成员与相应的简单类型变量一样可以进行结构体类型变量的各成员与相应的简单类型变量一样可以进行各种运算,例如:各种运算,例如:student2.score1=s
10、tudent1.score1;student2.score1=student1.score1;sum=stud1.score0+stud1.score1+stud1.score2;sum=stud1.score0+stud1.score1+stud1.score2;(2)(2)如果成员本身又属一个结构体类型,则要用若干成员运算符,如果成员本身又属一个结构体类型,则要用若干成员运算符,一级一级地找到最低的一级成员。一级一级地找到最低的一级成员。只能对最低级的成员进行赋只能对最低级的成员进行赋值或存取以及运算值或存取以及运算。例如:。例如:student1.birthday.day=01stude
11、nt1.birthday.day=01;student1.birthday.month=10student1.birthday.month=10;student.birthday.year=2004student.birthday.year=2004;(3)可以引用结构体类型变量成员的地址,也可以引用结构体变量的地址。例如:scanf(%f,&student.scorei)9.2.2 结构体类型变量的初始化结构体类型变量的初始化 和其他类型变量一样,对结构体变量可以在定义时指定初始值,但结构体类型变量汇集了各类不同数据类型的成员,所以结构体类型变量的初始化就略显复杂。例如:struct stu
12、 /*定义学生结构体类型*/char name20;/*学生姓名*/char sex;/*性别*/long num;/*学号*/float score3;/*三科考试成绩*/;struct stu student=liping,f,970541,98.5,97.4,95;当然我们也可以通过C提供的输入输出函数完成对结构体类型变量成员的赋值。由于结构体类型变量成员的数据类型通常是不一样的,所以一般是将结构体类型变量成员以字符串的形式输入,利用C的类型转换函数将其转换为所需类型。类型转换的函数有:int atoi(char*str);/*转换str所指向的字符串为整型。*/double atof(
13、char*str);/*转换str所指向的字符串为实型。*/long atol(char*str);/*转换str所指向的字符串为长整型。*/使用上述函数,要包含头文件stdlib.h。例如,对上述的结构体类型变量student各成员赋值可以采用以下方法:char temp20;gets(student.name);/*输入姓名*/student.sex=getchar();/*输入性别*/gets(temp);/*输入学号*/student.num=atol(temp);/*转换为长整型*/for(i=0;i3;i+)/*输入三科成绩*/gets(temp);student.scorei=a
14、toi(temp);/*转换为整型*/9.3 结构体数组 结构体数组与前面介绍过的基本数据类型数组的不同之处是每个数组元素都是一个结构体类型的数据,都包括多个成员数据项。9.3.1 9.3.1 结构体数组的定义结构体数组的定义 和定义结构体变量的方法相仿,只需说明其为数组即可。如:struct stu /*定义学生结构体类型*/char name20;/*学生姓名*/char sex;/*性别*/long num;/*学号*/float score3;/*三科考试成绩*/;struct stu stud3;/*定义结构体类型数组stud*/9.3.2 9.3.2 结构体数组的初始化结构体数组的
15、初始化 与其他类型一样,对结构体数组可以初始化。如:struct stu char name20;char sex;long num;float score3;struct stu stud3=liping,m,9901,78.4,68.5,99.4,weifeng,f,9902,67.4,88.5,90.0,xiaoling,m,9903,87.5,97.5,80.0;结构数组名结构数组名nn初值表初值表11,初值表初值表22,.,初值表初值表nn;9.3.3 结构体数组应用举例结构体数组应用举例【例【例9-19-1】建立一个有4个人的电子通信录,并输出通信录的内容。【思路导航】【思路导航】
16、设通信录的每一条记录都包括姓名、性别、出生年月、通信地址和联系电话几项,而在这几项中,出生年月又包括年份、月份和日期,通信地址又包括邮编和家庭地址两项,我们把这些联系较为紧密的内容又用单独的结构表示。对于4个人的记录可以定义一个包含4个元素的结构体数组。/*exam9_1*/*exam9_1*/#include stdio.hstruct addr /*通信地址结构定义*/char postcode10;/*邮编*/char addr40;/*家庭住址*/;struct birth /*出生年月结构定义*/int year;int month;int day;struct friend /*电
17、子通信录结构定义*/int number;char name20;char sex;struct birth birthday;struct addr address;char telephone13;friends4;int main(void)int i;/*以下是输入信息*/for(i=0;i4;i+)friendsi.number=i+1;printf(tenter NO.%d s data:n,i+1);printf(tenter name:);scanf(%s,friendsi.name);getchar();/*清除键盘缓冲区对输入的影响*/printf(ntenter sex(
18、m/f):);scanf(%c,&friendsi.sex);printf(ntenter birthday:);printf(nttyear:);scanf(%d,&friendsi.birthday.year);printf(nttmonth:);scanf(%d,&friendsi.birthday.month);printf(nttday:);scanf(%d,&friendsi.birthday.day);printf(ntpostcode:);scanf(%s,friendsi.address.postcode);printf(ntaddress:);scanf(%s,friend
19、si.address.addr);printf(ntphone:);scanf(%s,friendsi.telephone);/*以下是输出信息*/for(i=0;ipostcode=”510070”;p-addr=”guangzhou”;结构体变量在内存中的起始地址称为结构体变量的指针。下面通过一个简单例子来说明指向结构体变量的指针的应用。【例【例9-29-2】先从键盘给一个结构体类型变量的各成员赋值,然后在屏幕输出。/*exam9_2*/*exam9_2*/#includestdio.h#includestdlib.h /*使用malloc()需要*/struct addr char na
20、me10;char department10;/*部门*/char address20;/*住址*/char code10;/*邮编*/char phone12;/*电话号码*/char email20;/*Email*/;int main(void)/*定义main()函数*/struct addr*person;/*定义结构体类型指针变量*/person=malloc(sizeof(struct addr);/*为指针变量分配安全的地址*/printf(enter name,department,address,postcode,phone,Email:n);gets(person-nam
21、e);gets(person-department);gets(person-address);gets(person-code);gets(person-phone);gets(person-email);/*以下打印输出各成员项的值*/printf(nname:%sn,person-name);printf(department:%sn,person-department);printf(address:%sn,person-address);printf(postcode:%sn,person-code);printf(phone:%sn,person-phone);printf(Ema
22、il:%sn,person-email);return 0;通过指向结构变量的指针来访问结构变量的成员,与直接使用结构变量的效果是一样的,只是使用的成员运算符不同,前者为“-”,后者为“.”。如果指针变量pointer已指向结构变量var,则以下三种形式是等价的:(1)var.成员(2)pointer-成员 /*“-”称为指向运算符*/(3)(*pointer).成员 /*括号不能省!*/演示9.4.2 指向结构体数组的指针指向结构体数组的指针 定义结构体类型的指针,既可以指向结构体变量,也可以指向结构体数组。例如,可以在例9-2中定义的结构体类型基础上再定义结构体数组及指向结构体类型的指针如
23、下:struct addr char name10;char department10;/*部门*/char address20;/*住址*/char code;/*邮编*/char phone;/*电话号码*/char email20;/*Email*/;struct addr person4,*p;/*定义结构体数组person及指向结构体类型的指针p*/p=person;语句“p=person;”使指针p指向了结构体数组person。对数组元素的引用可采用三种方法。1)地址法person+i和p+i均表示数组第i个元素的地址,数组元素各成员的引用形式为:(person+i)-name、(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 学习 课件 09
限制150内