




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 结构体、链表与文件系统(1),结构体联合体枚举类型,系统给定的数据类型,在基本类型基础上自己定义的,记录某班30名学生的姓名、学号、性别、成绩、年龄int ages30; int ids30;char sexes30;char names3020; float scores30,概念引入:,解决问题:记录某班所有学生的成绩 3 名?,30 名?,float x,y,z;,float scores30;,结构体的定义及应用,思考,在程序里表示一个人(姓名、年龄、性别),怎么表示?想表示多个人呢?如何用计算机程序实现下述表格的管理?,表8-1 某学校学生成绩管理表,数组的解决方法,int studentId30; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/charstudentName3010;charstudentSex302;int timeOfEnter30; /*入学时间用int表示*/int scoreComputer30;/*计算机原理课的成绩*/int scoreEnglish30; /*英语课的成绩*/int scoreMath30; /*数学课的成绩*/int scoreMusic30; /*音乐课的成绩*/,int studentId30 = 1,2,3,4,5,6;charstudentName3010=令狐冲,林平之, 岳灵珊,任莹莹;charstudentSex302=男,男,女,女;int timeOfEnter30 = 1999,1999,1999,1999;int scoreComputer30 = 90,78,89,78;int scoreEnglish30 = 83,92,72,95;int scoreMath30 = 72,88,98,87;int scoreMusic30 = 82,78,66,90;,数组的解决方法,数据的内存管理方式,数组的解决方法,数组可处理大量的同类型数据,数组中的每一个元素都属于同一种数据类型,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理,希望的内存分配图,结构体的解决方法,struct STUDENT int studentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentSex4; /*每个学生的性别*/ inttimeOfEnter; /*每个学生的入学时间*/ intscoreComputer; /*每个学生的计算机原理成绩*/ intscoreEnglish; /*每个学生的英语成绩*/ intscoreMath; /*每个学生的数学成绩*/ intscoreMusic; /*每个学生的音乐成绩*/ ;struct STUDENT是一个类型struct STUDENT students4;,结构体,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,分号不能省略,例 struct student int num; char name20; char sex; int age; float score; char addr30; ;,结构体类型定义描述结构的组织形式,不分配内存,例如:要想把学生基本情况作为一个整体加以处理,比如:学号、姓名、性别、年龄、成绩、住址等。必须定义结构体类型,例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2;,结构体变量的定义1、先定义结构体类型,再定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;struct 结构体名 变量名表列;,定义结构体变量之后为其分配内存单元,结构体的内存占用,int 占用内存字节数 = 4struct 类型用内存字节数 = ?是所有成员变量的内存总和吗?,struct numbershort i; /2 char ch; /1 float f; /4 ;,printf(%dn, sizeof(struct number);,用运算符sizeof获得结构体大小sizeof(变量或表达式)sizeof(类型),8,Why?,结构体的内存占用,结构体所占的实际空间一般是按照机器字长对齐的与机器相关的,如32位系统:结构体类型大小=((成员数据类型大小的和+3)/4)*4(7+3)/4)*4=8,非所有成员变量的内存总和,8个字节,2、定义结构体类型的同时定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .变量名表列;,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,3、直接定义结构体变量一般形式:,struct 类型标识符 成员名; 类型标识符 成员名; .变量名表列;,例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,用无名结构体直接定义变量只能一次,说明结构体类型与结构体变量概念不同类型:不分配内存; 变量:分配内存结构体类型是一个模型,类似系统给定的基本类型比如int、 float 等类型,只是结构体类型是用户自定义的而已。结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆,7.1.3 结构体变量的引用引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,成员(分量)运算符优先级: 1结合性:从左向右,引用方式: 结构体变量名.成员名,结构体变量的初始化形式一:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;struct 结构体名 结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式二:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式三:,struct 类型标识符 成员名; 类型标识符 成员名; .结构体变量=初始数据;,例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,定义自己的类型名,struct student student1,student2;/*可以*/ student student1,student2;/*不可以*/typedef struct student STUD ; STUD student1,student2; /*可以!*/,typedef为一种已存在的类型定义一个新名字,STUD与struct student类型是同义词,struct student int num; char name20; char sex; int age; float score; char addr30;,结构体数组结构体数组的定义,struct student int num; char name20; char sex; int age; ;struct student stu30;,结构体数组初始化,例 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;,结构体数组引用,引用方式: 结构体数组名下标.成员名,S=“ZhaoDa” ,例 统计候选人选票,#include struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;iname,p-sex,p-age);,stu3,相当于p = ,7.1.4 结构体与函数,用结构体变量作参数- 值传递,效率低用结构体变量的成员作参数-值传递用指向结构体变量或数组的指针作参数-地址传递,struct date int year; int month; int day;void func(struct date p) p.year = 2000; p.month = 5; p.day = 22;,main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); func(d); printf(“%d,%d,%dn”, d.year, d.month, d.day);,1999,4,23,1999,4,23,结构体变量做函数参数,值传递,struct date int year; int month; int day;void func(struct date *p) p-year = 2000; p-month = 5; p-day = 22;,main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); func(,1999,4,23,2005,5,22,结构体指针做函数参数,指针做函数形参实参必须为地址值,struct date int year; int month; int day;struct date func(struct date p) p.year = 2000; p.month = 5; p.day = 22;,main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); d = func(d); printf(“%d,%d,%dn”, d.year, d.month, d.day);,结构体变量做函数返回值,存在一个错误,struct date int year; int month; int day;struct date func(struct date p) p.year = 2000; p.month = 5; p.day = 22; return p;,main() struct date d; d.year = 1999; d.month = 4; d.day = 23; printf(“%d,%d,%dn”, d.year, d.month, d.day); d = func(d); printf(“%d,%d,%dn”, d.year, d.month, d.day);,1999,4,23,2005,5,22,结构体变量做函数返回值,向函数传递结构体,向函数传递结构体的完整结构复制整个结构体成员的内容,多个值函数内对结构内容的修改不影响原结构内容传递更直观,但开销大向函数传递结构体的首地址用结构体数组/结构体指针做函数参数仅复制结构体的首地址,一个值修改结构体指针所指向的结构体的内容指针传递效率高,struct类型的特点,是一个普通的类型可以定义该类型的变量、数组、指针可以做函数的参数类型和返回值类型它的成员可以是任意类型基本类型、数组、指针、结构体、共用体struct类型的变量两个结构体变量之间可以相互赋值所以做为函数的参数时,是传值调用可以取地址&不可直接参与算术和比较运算面向对象和数据库是struct思想的发展,7.2 联合体(Union),构造数据类型,也叫共用体用途:使几个不同类型的变量共占一段内存(相互覆盖)联合体类型定义,union 联合体名 类型标识符 成员名; 类型标识符 成员名; .;,例 union data int i; char ch; float f; ;,类型定义不分配内存,7.2 联合体(Union),7.2 联合体(Union),struct number short i; char ch; float f;,union number short i; char ch; float f;,printf(%dn, sizeof(struct number);,8个字节,i,ch,f,4个字节,printf(%dn, sizeof(union number);,联合体类型变量占用的存储空间由占有最大存储区的成员决定,形式一: union data int i; char ch; float f; a,b;,形式二: union data int i; char ch; float f; ; union data a,b,c,*p,d3;,形式三: union int i; char ch; float f; a,b,c;,联合体变量的定义,共用体变量定义分配内存,长度=最长成员所占字节数,共用体变量任何时刻只有一个成员存在,联合体变量引用,引用规则不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例 union int i; char ch; float f; a; a=1; (),在定义共用体变量时只能初始化第一个成员,例 union int i; char ch; float f; a=1,a,1.5; (),可以用一个共用体变量为另一个变量赋值,例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; (),7.2 联合体(Union),同一内存单元在每一瞬时只能存放其中一种类型的成员,互相覆盖 ;起作用的成员是最后一次存放的成员不能作为函数参数不能给联合体变量名直接赋值 不能初始化,f,4个字节,struct person char name20; char sex; int age; union int single; struct char spouseName20; int child; married; struct date divorcedDay; marital; int marryFlag;,联合体的应用,union int single; struct char spouseName20; int child; married; struct date divorcedDay; marital;,struct char spouseName20; int child;married;,如果一个变量只有几种可能的值,可以定义为枚举类型enum 枚举量表;enum weekdays Sun ,Mon ,Tue ,Wed ,Thu ,Fri ,Sat ; enum boolean True=1,False=0 ;enum green,blue,yellow;,7.3 枚举类型,编译器在编译时,给枚举类型定义中列举的每一个元素指定一个整型常量值。不是变量(不能赋值),按顺序有固定的值(0,1-),也可改变其值。enum weekdays Sun ,Mon ,Tue ,Wed ,Thu ,Fri ,Sat ; 分别指定其元素的值为0、1、2、3、4、5、6可以在定义枚举类型时,指定元素的值。enum boolean True=1,False=0 ;说明枚举类型变量时,也可对其初始化。weekdays day1 = Fri ;,7.3 枚举类型,例:enu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年北京银行招聘考试(行政能力测验)历年参考题库含答案详解
- 2025广东佛山市南海区狮山高级中学招聘临聘教师3人笔试备考试题及答案解析
- 化工行业工伤预防管理规范
- 2.3.2长江 课件 商务星球版地理八年级上册
- 教师招聘之《小学教师招聘》能力检测附答案详解(典型题)
- 基于2025年的中医药康养旅游示范基地建设文化内涵研究报告
- 呼伦贝尔能源重化工工业园区谢尔塔拉产业区污水处理工程初步设计说明书带答案详解
- 教师招聘之《小学教师招聘》考前冲刺模拟题库提供答案解析含完整答案详解【易错题】
- 教师招聘之《小学教师招聘》通关检测卷及参考答案详解【b卷】
- 押题宝典教师招聘之《小学教师招聘》考试题库(模拟题)附答案详解
- 2025至2030年中国综合能源服务市场竞争策略及行业投资潜力预测报告
- 土地要素保障课件教学
- 2025-2026粤教粤科版(2024)科学三年级上册教学设计(附目录)
- 广东省深圳市福田区2024-2025学年八年级上学期语文期中考试试卷(含答案)
- 福建省泉州市2025届高三上学期质量监测(一)历史试卷(含答案)
- 《西门子S7-1200PLC编程及应用教程》全套教学课件
- 《鸿蒙应用开发项目教程》全套教学课件
- 肠道准备课件
- 精神运动康复
- 2025年陕西省中考数学试题卷(含答案详解)
- 2025年注册计量师考试计量器具管理与维护试卷
评论
0/150
提交评论