资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,2024/9/28,32,第7章 结构体、链表与文件系统1,结构体,联合体,枚举类型,1,C,数,据,类,型,基本类型,构造类型,指针类型,空类型,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,z;,float scores30;,结构体的定义及应用,思考,在程序里表示一个人姓名、性别、年龄,怎么表示?,想表示多少个人呢?,如何用计算机程序实现下述表格的管理?,表,7-1,某学校学生成绩管理表,学号,姓名,性别,入学时间,计算机原理,英 语,数 学,音 乐,1,令狐冲,男,1999,90,83,72,82,2,林平之,男,1999,78,92,88,78,3,岳灵珊,女,1999,89,72,98,66,4,任莹莹,女,1999,78,95,87,90,5, ,6, ,数组的解决方法,int,studentId30;,/*,最多可以管理,30,个学生,每个学生的学号用数组的下标表示*,/,char,studentName3010;,char,studentSex302;,int,timeOfEnter30;,/*,入学时间用,int,表示*,/,int,scoreComputer30;,/*,计算机原理课的成绩*,/,int,scoreEnglish30;,/*,英语课的成绩*,/,int,scoreMath30;,/*,数学课的成绩*,/,int,scoreMusic30;,/*,音乐课的成绩*,/,数据的内存管理方式,90,78,89,78,83,92,72,95,72,88,98,87,82,78,66,90,1,2,3,4,令狐冲,林平之,岳灵珊,任莹莹,男,男,女,女,1999,1999,1999,1999,数组的解决方法,数组可处理大量的同类型数据,数组中,的每一个元素都属于同一种数据类型,数据的内存管理方式,90,78,89,78,83,92,72,95,72,88,98,87,82,78,66,90,1,2,3,4,令狐冲,林平之,岳灵珊,任莹莹,男,男,女,女,1999,1999,1999,1999,数组的解决方法,分配内存不集中,寻址效率不高,对数组进行赋初值时,容易发生错位,结构显得比较零散,不容易管理,希望的内存分配图,1,令狐冲,男,1999,90,83,72,82,2,林平之,男,1999,78,92,88,78,3,岳灵珊,女,1999,89,72,98,66,4,任莹莹,女,1999,78,95,87,90,结构体的解决方法,struct,STUDENT,int,studentID;,/*,每个学生的序号*,/,char,studentName10;,/*,每个学生的姓名*,/,char,studentSex4;,/*,每个学生的性别*,/,int,timeOfEnter;,/*,每个学生的入学时间*,/,int,scoreComputer;,/*,每个学生的计算机原理成绩*,/,int,scoreEnglish;,/*,每个学生的英语成绩*,/,int,scoreMath;,/*,每个学生的数学成绩*,/,int,scoreMusic;,/*,每个学生的音乐成绩*,/,;,struct STUDENT,是一个类型,struct STUDENT,students4;,students0.,studentID,students0.,scoreComputer,它们都是变量,一般称为结构的成员变量,结构体,结构体是,一种,构造,数据类型,用途:把,不同类型,的数据组合成一个整体-,自定义,数据类型,结构体类型定义,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,成员类型可以是,根本型或构造型,struct,是,关键字,不能省略,合法标识符,可省,:,无名结构体,分号不能省略,例,struct student, int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,struct student,s,tu1,stu2;,结构体变量的定义,1,、先定义结构体类型,再定义结构体变量,一般形式:,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,struct,结构体名,变量名表列,;,定义结构体变,量之后,为其,分,配内存单元,name,num,sex,age,score,addr,4,字节,4,字节,20,字节,1,字节,4,字节,30,字节,.,stu1,结构体的内存占用,int,占用内存字节数,= 4,struct,类型用内存字节数,= ?,是所有成员变量的内存总和吗?,struct,number,short,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,i,f,ch,i,ch,f,非所有成员变量的内存总和,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 等类型,只是结构体类型是用户自定义的而已。,结构体可嵌套,结构体成员名与程序中变量名可相同,不会混淆,例,struct date, int month;,int day;,int year;,;,struct student, int num;,char name20;,struct date,birthday,;,stu,;,num,name,birthday,month,day,year,结构体变量的引用,引用规那么,结构体变量不能整体引用,只能引用变量成员,可以将一个,结构体变量赋值给另一个结构体变量,结构体嵌套时,逐级引用,成员,(,分量,),运算符,优先级,:,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, int 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 name20;,struct date, int month;,int day;,int year;,birthday;,stu1,stu2;,num,name,birthday,month,day,year,stu1.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, “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,stu,30,;,num,name,sex,age,num,name,sex,age,stu0,stu1,32B,结构体数组初始化,例,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 =,;,分行初始化,:,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;,str3;,stu1.age,+;,strcpy(,stu0.name,“,ZhaoDa”);,str0.name=“ZhaoDa ,结构体和指针,指向结构体变量的指针,定义形式:,struct,结构体名,*,结构体指针名;,例,struct student *p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,num,name,sex,age,stu,p,struct student, int num;,char name20;,char sex;,int age;,stu;,struct student *p=,(*,结构体指针名,).,成员名,结构体指针名,-,成员名,结构体变量名,.,成员名,指向运算符,优先级,: 1,结合方向:从左向右,#include,main(), struct student, long int num;,char name20;,char sex;,float score;,stu_1,*p;,p=,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;,int *p=,*p,=10;,n,=10,struct student stu1;,struct student *p=,stu1.num,=101,; ,(*p).num,=101,运行结果,:,No:89101,name: Li Lin,sex:M,score: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);,num,name,sex,age,stu0,p,stu1,stu2,p+1,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;,;,0x0037b00,union,number,short,i;,char,ch;,float,f;,;,printf(%dn, sizeof(struct number);,i,ch,f,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;,联合体变量的定义,f,ch,i,f,ch,i,a,b,共用体,变量定义,分配内存,长度=,最长成员,所占字节数,共用体,变量任何时刻,只有,一个成员,存在,联合体变量引用,引用规那么,不能引用共用体变量,只能引用其成员,共用体指针名,-,成员名,共用体变量名,.,成员名,(*,共用体指针名,).,成员名,共用体变量中起作用的成员是,最后一次存放的成员,例,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,0x0037b00,同一内存单元在每一瞬时只能存放其中一种类型的成员,互相覆盖 ;,起作用的成员是,最后一次存放,的成员,不能作为函数参数,不能给联合体变量名直接赋值,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;,;,联合体的应用,姓名,name,性别,sex,年龄,age,婚姻状况,婚姻状况,标记,未婚,已婚,离婚,配,偶,子,女,年,月,日,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,False=0 ;,7.3 枚举类型,例:,enum _weekday workday;,workday=mon;,printf(%dn, workday) /* 输出1 */,假设:,enum _weekday sun=7, mon=1, tue, wed, thu, fri, sat workday;,workday=tue;,printf(%dn, workday) /* 输出2 */,workday=2; /*整型数不能直接赋值给枚举变量, 类型不匹配 */,workday=(enum weekday)2; /* 可以赋值,相当于将顺序号为2的枚举元素赋给workday */,
展开阅读全文