c语言第7章_1结构体联合体_第1页
c语言第7章_1结构体联合体_第2页
c语言第7章_1结构体联合体_第3页
c语言第7章_1结构体联合体_第4页
c语言第7章_1结构体联合体_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 结构体、链表与文件系统(1),结构体联合体枚举类型,系统给定的数据类型,在基本类型基础上自己定义的,记录某班30名学生的学号、姓名、性别、年龄、成绩int ids30; char names3020; char sexes30; int ages30; float scores30,概念引入:,解决问题:记录某班所有学生的成绩 3 名?,30 名?,float x,y,z;,float scores30;,结构体的定义及应用,思考,在程序里表示一个人(姓名、性别、年龄),怎么表示?想表示多少个人呢?如何用计算机程序实现下述表格的管理?,表7-1 某学校学生成绩管理表,数组的解决方法,int studentId30; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/charstudentName3010;charstudentSex302;int timeOfEnter30; /*入学时间用int表示*/int scoreComputer30;/*计算机原理课的成绩*/int scoreEnglish30; /*英语课的成绩*/int scoreMath30; /*数学课的成绩*/int scoreMusic30; /*音乐课的成绩*/,数据的内存管理方式,数组的解决方法,数组可处理大量的同类型数据,数组中的每一个元素都属于同一种数据类型,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高 对数组进行赋初值时,容易发生错位 结构显得比较零散,不容易管理,希望的内存分配图,结构体的解决方法,struct STUDENT int studentID; /*每个学生的序号*/ char studentName10;/*每个学生的姓名*/ char studentSex4; /*每个学生的性别*/ inttimeOfEnter; /*每个学生的入学时间*/ intscoreComputer; /*每个学生的计算机原理成绩*/ intscoreEnglish; /*每个学生的英语成绩*/ intscoreMath; /*每个学生的数学成绩*/ intscoreMusic; /*每个学生的音乐成绩*/ ;struct STUDENT是一个类型struct STUDENT students4;students0.studentIDstudents0.scoreComputer它们都是变量,一般称为结构的成员变量,结构体,结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型结构体类型定义,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,分号不能省略,例 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 等类型,只是结构体类型是用户自定义的而已。结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆,结构体变量的引用引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用,成员(分量)运算符优先级: 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;,例 struct student int num; char name20; char sex; int age; stu =,;,结构体数组引用,引用方式: 结构体数组名下标.成员名,=“ZhaoDa” ,结构体和指针指向结构体变量的指针定义形式:struct 结构体名 *结构体指针名;例 struct student *p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符优先级: 1结合方向:从左向右,#includemain() struct student long int num; char name20; char sex; float score; stu_1,*p; p=,例 int n; int *p= n=10,struct student stu1;struct student *p= (*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;pnum,p-name,p-sex,p-age);,stu3,相当于p = ,构造数据类型,也叫共用体用途:使几个不同类型的变量共占一段内存(相互覆盖)共用体类型定义,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 _weekday Sun ,Mon ,Tue ,Wed ,Thu ,Fri ,Sat ; typedef enum _weekday Sun ,Mon ,Tue ,Wed ,Thu , Fri ,Sat weekday; weekday workay;enum boolean True=1,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论