




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 结构体、链表与文件系统1结构体联合体枚举类型1C数据类型基本类型构造类型指针类型空类型void定义类型typedef数值类型字符类型char枚举类型enum整 型浮点型单精度型float双精度型double短整型short长整型long整型int数组结构体struct联合体union系统给定的数据类型在根本类型根底上自己定义的记录某班30名学生的学号、姓名、性别、年龄、成绩int ids30; char names3020; char sexes30; int ages30; float scores30概念引入:解决问题:记录某班所有学生的成绩 3 名? 30 名?float x,y
2、,z;float scores30;结构体的定义及应用思考在程序里表示一个人姓名、性别、年龄,怎么表示?想表示多少个人呢?如何用计算机程序实现下述表格的管理? 表7-1 某学校学生成绩管理表学号姓名性别入学时间计算机原理英 语数 学音 乐1令狐冲男1999908372822林平之男1999789288783岳灵珊女1999897298664任莹莹女1999789587905 6 数组的解决方法int studentId30; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/charstudentName3010;charstudentSex302;int timeOfEnte
3、r30; /*入学时间用int表示*/int scoreComputer30;/*计算机原理课的成绩*/int scoreEnglish30; /*英语课的成绩*/int scoreMath30; /*数学课的成绩*/int scoreMusic30; /*音乐课的成绩*/数据的内存管理方式 907889788392729572889887827866901234令狐冲林平之岳灵珊任莹莹男男女女1999199919991999数组的解决方法数组可处理大量的同类型数据,数组中的每一个元素都属于同一种数据类型数据的内存管理方式 90788978839272957288988782786690123
4、4令狐冲林平之岳灵珊任莹莹男男女女1999199919991999数组的解决方法分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理希望的内存分配图 1令狐冲男1999908372822林平之男1999789288783岳灵珊女1999897298664任莹莹女199978958790结构体的解决方法struct STUDENT int studentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentSex4; /*每个学生的性别*/ inttimeOfEnter; /*每个学生的入学时
5、间*/ intscoreComputer; /*每个学生的计算机原理成绩*/ intscoreEnglish; /*每个学生的英语成绩*/ intscoreMath; /*每个学生的数学成绩*/ intscoreMusic; /*每个学生的音乐成绩*/ ;struct STUDENT是一个类型struct STUDENT students4;students0.studentIDstudents0.scoreComputer它们都是变量,一般称为结构的成员变量结构体结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义struct 结构体名 类型标识符 成员
6、名; 类型标识符 成员名; .;成员类型可以是根本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体分号不能省略例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 结构体变量的定义1、先定义结构体类型,再定义结构体变量一般形式: struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;struct 结构体名 变量名表列;定义结构体变量之后为其分配内存单元namenumsexagescoread
7、dr4字节4字节20字节1字节4字节30字节.stu1结构体的内存占用int 占用内存字节数 = 4struct 类型用内存字节数 = ?是所有成员变量的内存总和吗?struct numbershort i; /2 char ch; /1 float f; /4 ;printf(%dn, sizeof(struct number);用运算符sizeof获得结构体大小sizeof(变量或表达式)sizeof(类型)8Why?结构体的内存占用事实上所有数据类型在内存中都是从偶数地址开始存放的且结构所占的实际空间一般是按照机器字长对齐的特定数据类型的数据项的大小是与机器相关的,如32位系统:结构体类
8、型大小=(成员数据类型大小的和+3)/4*47+3/4*4=8ifchichf非所有成员变量的内存总和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; ch
9、ar sex; int age; float score; char addr30; stu1,stu2; 用无名结构体直接定义变量只能一次结构体类型与结构体变量概念不同类型:不分配内存; 变量:分配内存结构体类型是一个模型,类似系统给定的根本类型比方int、 float 等类型,只是结构体类型是用户自定义的而已。结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;numnam
10、ebirthdaymonthdayyear结构体变量的引用引用规那么 结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级: 1结合性:从左向右引用方式: 结构体变量名.成员名例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例 struct student i
11、nt num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ()例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )例 struct student int num; char name2
12、0; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;结构体变量的初始化形式一:struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;struct 结构体名 结构体变量=初始数据;例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin,M,19,
13、“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,
14、“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
15、addr30;结构体数组结构体数组的定义struct student int num; char name20; char sex; int age; ;struct student stu30;numnamesexagenumnamesexagestu0stu132B结构体数组初始化例 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,
16、20, 101,“Li Gang,M,19, 110,“Liu Yan,F,19; 例 struct student 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 stude
17、nt int num; char name20; char sex; int age; str3;stu1.age+;strcpy(, “ZhaoDa”);=“ZhaoDa 结构体和指针指向结构体变量的指针定义形式:struct 结构体名 *结构体指针名;例 struct student *p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstruct student int num; char name20; char sex; int age; stu;struct student *p=&stu;(*结构
18、体指针名).成员名结构体指针名-成员名结构体变量名.成员名指向运算符优先级: 1结合方向:从左向右#includemain() struct student long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,Li Lin); p-sex=M; p-score=89.5; printf(nNo:%ldnname:%snsex:%cnscore:%fn, (*p).num,p-name,stu_1.sex,p-score);例 int n;
19、 int *p=&n; *p=10; n=10struct student stu1;struct student *p=&stu1;stu1.num=101; (*p).num=101运行结果:No:89101name: Li Lin sex:Mscore:89.5指向结构体数组的指针struct student int num; char name20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu
20、;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1stu3相当于p = &stu0;构造数据类型,也叫共用体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义union 共用体名 类型标识符 成员名; 类型标识符 成员名; .;例 union data int i; char ch; float f; ;类型定义不分配内存7.2 联合体union7.2 联合体unionstruct number short i; char ch; float f;0 x0037b00union number short i; char
21、ch; float f;printf(%dn, sizeof(struct number);ichf8个字节ichf4个字节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;联合体变量的定义fchifchiab共用体变量定义
22、分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在联合体变量引用引用规那么不能引用共用体变量,只能引用其成员共用体指针名-成员名共用体变量名.成员名(*共用体指针名).成员名共用体变量中起作用的成员是最后一次存放的成员例 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 联合体union0 x0037b00同一内存单元在每一瞬时只能存放其中一种类型的成员,互相覆盖 ;起作用的成员是最后一次存放的成员不能作为函数参数不能给联合体变量名直接赋值 f4个字节struct person char name20; char sex; int age; union int single;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子劳动合同企业HR使用手册
- 办公大楼物业管理委托合同范例二零二五年
- 中医师承合同书
- 二零二五版采矿权质押借款合同
- 二零二五买卖煤矸石协议合同书
- 建筑工程项目股份合作协议二零二五年
- 养老院承包经营合同
- 正规物流运输合同二零二五年
- 2025项目施工合同范本(标准版)
- 2025石墨型炭黑建设项目 沸腾炉系统工程安装合同
- 天津市河东区2024-2025学年九年级下学期结课考试化学试题(含答案)
- 动物疾病的临床表现试题及答案
- 广东省广州市2025届高三下学期综合测试(一)英语试卷
- 山东省济南育英中学 2024-2025学年下学期七年级3月月考英语试题(原卷版+解析版)
- 2024年全国高考体育单招考试语文试卷试题(含答案详解)
- GB/T 11344-2021无损检测超声测厚
- 胬肉攀晴中医护理常规
- 电力行业迎峰度夏措施检查情况表
- 煤矿培训教案机电安全知识
- 建设工程竣工联合验收申请报告及意见表
- 淮安钵池山公园景观项目分析
评论
0/150
提交评论