版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 九 章 结构体与共用体,C语言程序设计,在实际问题中,一组数据往往具有不同的数据类型。例如,学生信息登记表:,结构(结构体)是一种数据类型,同基本数据类型中的字符型和整型一样。不同的是,结构由基本类型或结构类型的数据组成,组成方式可自定义。 结构的意义:它给人们提供了封装一组数据在一个节点内的能力。,9.1 结构体9.1.1结构类型定义,“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。,struct 结构体名 类型标识符 成员名; 类型标识符 成员名;
2、 . ;,成员类型可以是 基本型或构造型,struct是关键字, 不能省略,合法标识符 可省:无名结构体,一、结构的定义,struct stu int num; char name40; char class40; char sex; char birthday20; float score; ;,用C+语言的数组变量定义相应的数据关系: struct stu s4;,struct stu int num; char name40; char class40; char sex; char birthday20; float score; ;,结构体类型定义描述结构 的组织形式,不分配内存,9
3、.1.2 结构体变量说明,例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;,先定义结构体类型,再定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 变量名表列;,定义结构体类型的同时定义结构体变量 一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct student int num; c
4、har name20; char sex; int age; float score; char addr30; stu1,stu2;,直接定义结构体变量 一般形式:,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,用无名结构体直接定义 变量只能一次,说明 结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程
5、序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期,9.1.3 结构体变量的引用 引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用,成员(分量)运算符 优先级: 1 结合性:从左向右,引用方式: 结构体变量名.成员名,一、结构体变量的赋值,#include #include struct stu int num; char name20; char sex; float score; student1,student2; main() student1.num=1002; strcpy(,J
6、in); printf(input sex and scoren); scanf(“%c%f, ,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,二、结构体变量的初始化,例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Bei
7、jing Road”;,例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,9.1.4 结构体数组 结构体数组的定义 三种形式:,形式一: struct student int num; char name20; char sex; int age; ; struct student stu2;,形式二: struct student int num; char name20; char sex; int age; stu2;,形
8、式三: struct int num; char name20; char sex; int age; stu2;,结构体数组初始化,例 struct int num; char name20; char sex; int age; stu =,;,顺序初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19;,例 struct student int num; cha
9、r name20; char sex; int age; stu =,;,结构体数组引用,引用方式: 结构体数组名下标.成员名,例 统计学生平均成绩和不及格学生人数。,#include struct stu int num; char name20; char sex; float score; student5=1001,LiXiao,M,89.00, 1002, Jin,F, 90.00, 1003, Feng,F,60.50, 1004, Rong,M,74.50, 1005, ZhuJi,F,55.00; void main() int i,c=0; float ave,s=0; fo
10、r(i=0;i5;i+) s+=studenti.score; if(studenti.score60) c+=1; printf(s=.2fn,s); ave=s/5; printf(average=.2fncount=dn,ave,c); ,main函数中用for语句逐个累加各元素的score 成员值存于s之中,如score的值小于60(不及格)即计数器C加1,循环完毕后计算平均成绩,并输出全班总分、平均分及不及格人数。,9.1.5 指向结构体变量的指针 指向结构体变量的指针 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,使用结构体指针变量引
11、用成员形式,存放结构体变量在内存的起始地址,指向运算符 优先级: 1 结合方向:从左向右,例 指向结构体的指针变量,#include struct stu int num; char name20; char sex; float score; student1=1001, LiXiao,M, 89.00,*pstu; void main() pstu= ,例 int n; int *p= n=10,struct stu int num; char name20; char sex; float score; student1,student2,*pstu1= (*pstu1).num=101
12、,9.1.7 动态存储分配,语言中不允许动态数组类型。 例如: int n; scanf(%d, 这种用变量表示长度,对数组的大小作动态说明,这是错误的。但是在实际的编程中,经常可能出现所需的内存空间取决于实际输入的数据的情况,事前无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。常用的内存管理函数有以下三个:,调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为size 字节的连续区域。函数的返
13、回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。 (类型说明符*)表示把返回值强制转换为该类型指针。 “size”是一个无符号数。 例如:pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。,1.分配内存空间函数malloc,calloc 也用于分配内存空间。调用形式: (类型说明符*)calloc(n,size) 功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。 (类型说明符*)用于强制类型转换。,2.分配
14、内存空间函数 calloc,calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。 例如: ps=(struct stu*) calloc(2,sizeof (struct stu); 其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。,调用形式: free(void *ptr); 功能:释放ptr所指向的一块内存空间,ptr 是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。,3.释放内存空间函数fr
15、ee,9.1.8结构体与链表,节点之间的逻辑关系,假设我们将结构体类型定义如下: struct entry int value; struct entry *next; ; 这样就定义了entry结构体类型,该结构体类型含有两个成员。结构的第一个成员是简单的整数value。结构的第二个成员是next成员,该成员是一个指向entry结构的指针,假设我们把两个变量定义成struct entry类型如下: struct entry n1,n2; 执行下列语句可使n1结构的next指针指向n2结构。 n1.next=,假如n3变量也定义成struct entry类型,那么用下列语句可加入另一个“链接”
16、。 n2.next=,【例9.7】 #include main() struct entry int value; struct entry *next; ; struct entry n1,n2,n3; int i; n1.value=100; n2.value=200; n3.value=300; n1.next= ,结果输出: 200300,链表结点的删除,语句:n1.next=n2.next; 或n1.next=,链表结点的插入,语句:n2_3.next=n2.next;n2.next= 成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名,例如: union data int
17、 i; char ch; float f; ; 图9.11 共用体存储结构,一、共用体的定义,结构体与共用体 区别: 存储方式不同,联系: 两者可相互嵌套,二、共用体变量的说明,共用体变量的说明和结构变量的说明方式相同,也有三种形式。 先定义,再说明 定义同时说明 直接说明,三、共用体变量的赋值和使用,对共用体变量的赋值,使用都只能是对变量的成员进行。共用体变量的成员表示为: 共用体变量名.成员名,【例9.12】#include void main() union ab int a; char ch4; c; c.a=0 x12345678; for(int i=0;i=3;i+) print
18、f(chd=xn,i,c.chi); ,运行结果: ch0=78 ch1=56 ch2=34 ch3=12 程序说明: 例9.15的程序中,共用体变量c的成员ch0ch3分别对应成员a的第1第4字节(a为整型变量)。,9.3 枚举,枚举是一个被命名的整型常数的集合, 枚举在日常生活中很常见。例如表示星期的SUN, MON, TUE, WED, THU, FRI, SAT 就是一个枚举。,枚举的说明与结构体和共用体体相似, 其形式为: enum 枚举名标识符 常量标识符=整型常数, 常量标识符=整型常数, . 常量标识符=整型常数, 枚举变量;,如果枚举没有初始化, 即省略=整型常数时, 则从第
19、一个标识符开始,顺序给每个标识符一个序列号0, 1, 2, .。但当枚举中的某个成员赋值后, 其后的成员则按此数值依次加1作为其序列号。,例如下列枚举说明后, x1, x2, x3, x4的值分别为0, 1, 2, 3。 enum stringx1, x2, x3, x4x;,当定义改变成: enum string x1, x2=0, x3=50, x4, x; 则x1=0, x2=0, x3=50, x4=51,注意: 1. 枚举中每个成员(标识符)结束符是, 不是;, 最后一个成员可省略,。 2. 初始化时可以赋负数, 其后的标识符仍依次加1。 3. 枚举变量只能取枚举说明结构中的某个标识
20、符常量。 例如: enum string x1=5, x2, x3, x4, ; enum strig x=x3; 此时, 枚举变量x实际上是7。,9.4 自定义数据类型 功能:用自定义名字为已有数据类型命名 类型定义简单形式: typedef type name;,例 typedef int INTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef float REAL;,类型定义后,与已有类型一样使用,例 INTEGER a,b,c; REAL f1,f2;,说明: 1.typedef 没有创造新数据类型 2.typedef 是定义类型,不能定义变量 3.typedef 与 define 不同,define typedef 预编译时处理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 力与运动 试卷
- 钳工及其工艺基础训练 5
- 广东汕头市龙湖区2025-2026学年一年级下学期语文第一次素养练习(一)试卷
- 学校周边环境综合整治“百日行动”排查表
- 2025年人工智能伦理评估技术治理框架
- 2025年人工智能伦理评估国际合作案例
- 气管食管瘘的护理质量改进与评估
- 盆腔炎的跨学科治疗模式
- 招聘卫生纸工厂管理岗
- 特殊科室护理人员的职业发展
- 胸痹患者中医护理评估与干预
- 2026年4月福建厦门市思明区部分单位联合招聘非在编人员4人笔试模拟试题及答案解析
- 江苏苏豪控股集团秋招面笔试题及答案
- 24J113-1 内隔墙-轻质条板(一)
- 律师事务所内部惩戒制度
- 高中英语课堂形成性评价与听力理解能力提升教学研究课题报告
- 校园校园环境智能监测系统方案
- (2025年)资阳市安岳县辅警考试公安基础知识考试真题库及参考答案
- 制动排空气课件
- 大学生药店创业计划书
- 药品生产验证指南
评论
0/150
提交评论