版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第8章 结构体和共用体,学习目标,掌握结构体类型、结构体变量、结构体数组的定义 掌握结构体变量指针、结构体数组元素指针等基本概念 掌握结构体指针的声明、初始化、赋值及引用 了解共用体类型的定义、共用体变量的声明、赋值及使用 了解枚举类型的定义、枚举类型变量的声明、赋值及使用 理解typedef的功能,8.1 结构体,数组中各元素是属于同一个类型。 若要将不同类型的数据组合成一个有机的整体,例如:姓名、年龄、性别、成绩组合为一个组合项,C用结构体来建立这种数据结构。,8.1.1 结构体类型,一个结构体类型可以由若干个被称为成员(或域)的成分组成。 每个成员具有自身的名字和数据类型,同一结构中的成
2、员名不能相同。例如一个学生的信息,它包括以下5项: (1) 学号:用5位数字表示,长整型; (2) 姓名:用汉语拼音表示,最多20个字符; (3) 性别:用M或F表示,分别表示男或女; (4) 生日:如19881015,表示年月日; (5) 地址:用字符数组表示,最多30个字符。,8.1.2 结构体类型的声明,一个结构体类型的一般形式为: struct 结构体名 类型名1 成员名1; 类型名2 成员名2; 类型名n 成员名n; ;,例如: struct stu long int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ uns
3、igned long birthday; /* 生日 */ char addr30; /* 地址 */ ;,说明:,(1) 结构体声明描述了结构体的组织形式,但在编译时并不为它分配存储空间。 (2) 结构体的成员可以是简单变量、数组、指针、结构体或共用体等。 (3) 结构体不可嵌套定义,但可以嵌套使用,例如: struct date int day; char month4; int year; ; struct student long int num; char name20; char sex; struct date birthday; /* 结构体成员是另一种结构类型,结构体在此嵌套
4、 */ char *addr; ;,嵌套结构体student的逻辑结构,(4) 结构体声明可以在函数内部,也可以在函数外部。 (5) 定义结构体类型时,注意不能遗漏最后的分号。,8.1.3 结构体变量,一、结构体变量的定义 可以采取以下三种方法定义结构体类型变量。 1在声明结构体类型的同时定义变量。例如: struct student long int num; char name20; char sex; int age; float score; s1,s2,s3;,声明结构体类型的同时定义结构体变量的一般形式为: struct 结构体名 类型名1 成员名1; 类型名2 成员名2; 类型名
5、n 成员名n; 变量名,变量名,变量名m; 特点:定义一次结构体变量之后,在该定义之后的任何位置仍可用该结构体类型来定义其它结构体变量。,2直接定义结构类型变量 例如: struct long int num; char name20; char sex; int age; float score; stu1,stu2,stu3;,直接定义结构体变量的一般形式为: struct 类型名1 成员名1; 类型名2 成员名2; 类型名n 成员名n; 变量名,变量名,变量名m; 特点:由于在struct后不出现结构体名,故不便于在源程序的其他地方定义该类型的新变量。,3先声明结构体类型再定义变量名 例
6、如: struct student long int num; char name20; char sex; int age; float score; ; struct student stu1,stu2,stu3;,一般形式为: struct 结构体名 类型名1 成员名1; 类型名2 成员名2; 类型名n 成员名n; ; struct 结构体名 变量名,变量名,变量名m; 特点:在该定义之后的任何位置,不仅可用该结构体类型来定义其他结构体变量,而且可把其结构体声明部分作为文件存放起来,这样就可借助于include命令把它复制到任何源文件中,用以定义同类型的其它结构体变量。,注意:,(1)
7、定义一定要在结构体声明之后或与结构体声明同时进行,对尚未声明的结构体类型,不能用它来定义结构体变量。 (2) 存储空间分配是按照其对应的各成员项的定义顺序进行的。 (3) 同一结构类型的每个结构体变量,存储空间的大小都相同,是各成员项所占空间之和。例如: sizeof(stu1)的值为31; sizeof(struct student)的值为31; sizeof(float)的值为4。 (4) 结构体变量中的成员可以单独使用,地位与一般变量相同。 (5) 结构体变量一般不用register型。,二、结构体变量的初始化,struct student long int num; char name
8、20; char sex; char addr20; stu1,stu2=89031,Lilin,M,123 Beijing Road; /* 结构体变量stu2初始化 */,三、结构体变量的引用,形式: 结构体变量名成员名 #include void main() struct student long int num; char name20; char sex; char addr20; stu1,stu2=89031,Lilin,M,123 Beijing Road; /* 结构体变量stu2初始化 */ printf(NO.:%ldnname:%snsex:%cnaddress:%s
9、n,stu2.num,,stu2.sex, stu2.addr); stu1=stu2; /* 两个相同类型的结构体变量之间可以进行赋值操作 */ printf(NO.:%ldnname:%snsex:%cnaddress:%sn,stu1.num,,stu1.sex, stu1.addr); ,注意: (1) 不能将一个结构体变量作为一个整体进行输入和输出。例:scanf(%ld%s%c%s, (4) 如果成员本身又属一个结构体类型,则要逐级地找到最低的一级成员。只能对最低级的成员进行存取。,8.2 结构体数组,8.2.1 结构体数组的定义,1定义结构体类
10、型后定义结构数组。例如: struct student long int num; char name20; char sex; int age; float score; ; struct student stu5;,2直接定义一个结构数组。 例如: struct student long int num; char name20; char sex; int age; float score; stu5;,或 struct long int num; char name20; char sex; int age; float score; stu5;,8.2.2 结构数组的初始化,格式:
11、struct 结构体名 结构数组名元素个数=初始数据; struct student stu3=80101,Lilin,M,18, 80102,Wanglan,F,19,80103,Zhangjun,F,20; struct student stu =80101,Lilin,M,18, 80102,Wanglan,F,19,80103,Zhangjun,F,20;,struct student long int num; char name20; char sex; int age; stu = 80101, Lilin,M,18, 80102, Wanglan,F,19, 80103, Zh
12、angjun,F, 20;,8.2.3 结构数组元素的引用,形式: 结构体数组名下标成员名 例如 stu0.num=80101; strcpy(,Lilin);,例:统计全班男女生人数及1990年以后(含1990年)出生的人数。 #include string.h #include stdio.h void main() struct stud /* 定义一个结构stud ,包含3个成员 */ char name20;/* 姓名 */ char sex;/* 性别 */ int year; /* 出身年份 */ ; struct stud class100; /* 定义一个结
13、构数组class */ int m_num=0,f_num=0,total90=0,class_num,i ; printf(Please enter class_num: ); scanf(%d, ,for(i=0;i=1990) total90+; /* 统计90以后出生的人数 */ printf(n number of boy: %d,m_num); printf(n number of girl: %d,f_num); printf(n number after of 1990: %d,total90); ,测试数据与运行结果: 输入:Please enter class_num: 3
14、 Please enter name/sex/year: Zhanglin m 1988 Please enter name/sex/year: Wangpin f 1990 Please enter name/sex/year: Liutao M 1989 输出:Zhanglin m 1988 Wangpin f 1990 Liutao M 1989 number of boy: 2 number of girl: 1 number after of 1990: 1,8.3 结构指针,8.3.1指向结构体变量的指针 形式: struct 结构体名 *结构指针名; 例: static stru
15、ct student *p; 结构指针在定义时也可以初始化。 例: struct student long int num; char name20; char sex; int age; float score; stu1,*p=,用指针引用结构体成员的一般形式: (*结构指针名).成员名 或 结构指针名-成员名 设有类型、变量声明及初始化如下: struct date int day; char month4; int year; birthday,*sp= 则 (*sp).day、(*sp).month、sp-day、sp-month均是合法。其中 (*sp).day和sp-day等效
16、(*sp).month和sp-month等效。,例: #includestdio.h #includestring.h void main() struct stud char *num; char name20; float score; ; struct stud stu1,*sp; sp= ,注意: (1) *sp两侧的括号不可省,因为成员运算符“.”优先于“*”运算符,*sp.num就等价于*(sp.num)了。 (2) 由于运算符“-”、“.”、“()”和“”的优先级最高,其结合性相同。例如: +sp-num等价于:+(sp-num)即成员值加1。 (+sp)-num:先执行sp=s
17、p+1,再执行sp-num(注意sp的值已经改变)。 sp+-num或(sp+)-num:先存取sp-num,再执行 sp=sp+1。 sp-num+:先存取sp-num,再使成员值加1。,8.3.2 指向结构数组的指针,#include struct student long int num; char name20; char sex; int age; stu3=80101,Lilin,M,18,80102,Yanglan,F,19, 80103,Zhangjun,F,20; void main() struct student *p; /* p是指向struct student型数据的
18、指针变量 */ printf(nNo.tNamettsextagen); for(p=stu;pnum,p-name, p-sex, p-age); 运行结果: No Name sex age 80101 Lilin M 18 80102 Yanglan 19 80103 Zhangjun 20,8.3.3 结构体变量做函数参数,1用结构体变量的成员作参数。 例如,用stu1.num或作函数实参,将实参值传给形参,“值传递”方式。 2用结构体变量作实参。 采用“值传递”方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。,例:有一个结构体变量stu1,内含学生学号、姓名、数学和英语两门课的成绩。要求在main函数中赋值,在函数print中将它们打印输出。 #include #include struct student long int num; char name20; float math; float e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 要求降低价格教学设计中职专业课-商务英语函电-国际商务-财经商贸大类
- 任务一 蔬果雕刻说课稿2025学年初中劳动技术浙教版八年级上册-浙教版
- 小学趣味拓展数学迷宫说课稿
- 高中生社会责任强化主题班会说课稿
- Lesson 3 Months of the Year教学设计小学英语四年级下册冀教版(一起)
- Unit 6 Cartoons and Comic Strips教学设计高中英语上海新世纪版高一年级第一学期-新世纪版2007
- 《口语交际:趣味故事会》教学设计统编版语文三年级下册
- 4.12.1神经条件的基本方式-反射第二课时教学设计2023-2024学年人教版生物七年级下册
- 大体积混凝土温控施工验收规范
- 深基坑支护安全专项预案设计
- 申请建房报告范文
- 高速铁路供电安全检测监测系统(6C系统)总体技术规范
- 钢结构工程投标方案(技术方案)
- 《认识人民币》教学课件(人教版小学数学一年级下册)
- 河西学院毕业论文答辩精美模板
- 2023矿产资源潜力评价规范(1∶250 000)第一部分:总则
- 前荣坯布质量培训课件
- 劳动创造美好生活第四章
- 2011-2022年中国美术学院附属中学招生考试数学历年试题真题
- 实施活动观落实英语学科核心素养
- 外研版小学英语教材培训
评论
0/150
提交评论