《第11章 结构体与共用体课件》由会员分享,可在线阅读,更多相关《第11章 结构体与共用体课件(57页珍藏版)》请在金锄头文库上搜索。
1、第11章 结构体与共用体,概述 定义结构体类型变量的方法 结构体类型变量的引用 结构体变量的初始化 结构体数组 指向结构体类型数据的指针 用指针处理链表 共用体 枚举类型 用typedef定义类型,1. 概述,除数组外,前面介绍的数据类型都是简单类型: 整型、实型、字符型 数组是构造类型,但其所有的元素具有相同的数据类型。 本章将介绍另外一种构造类型:结构体,它的特点是内含的数据元素成员可以具有不同的数据类型。,例如: struct student unsigned int No; char name32; unsigned short age; float score; char addre
2、ss64; ;,“记录”结构体包含不同数据类型的“数据项”数据元素,每个记录作为整体进行考虑。,1. 概述,声明结构体类型的形式: struct 结构体名称 成员列表 ; 声明后的结构体类型就可以同其它的数据类型一样用来定义变量等。 结构体中的成员可以是一个简单的基本类型,也可以是复杂的构造类型。 类型与变量是不同的概念,这里只是定义了类型,尚未定义变量,因此未分配内存空间。,struct University char name32; struct School school50; ;,例如: struct School char name32; int num_staff; int typ
3、e; ;,2. 定义结构体类型变量的方法,先声明结构体类型再定义变量名 在声明类型的同时定义变量 直接定义结构体类型变量,不出现结构体名,struct student unsigned int No; char name32; unsigned short age; float score; char address64; ; struct student stu1, stu2; struct student *stu3;,struct student unsigned int No; char name32; unsigned short age; float score; char add
4、ress64; stu1, stu2, *stu3;,struct unsigned int No; char name32; unsigned short age; float score; char address64; stu1, stu2, *stu3;,2. 定义结构体类型变量的方法,说明: 类型与变量是不同概念; 结构体成员可以单独使用; 成员也可以是结构体变量; 成员名称可以与程序中的其它变量名称相同,是两个不同的对象。,sizeof(int) 4 sizeof(struct student) ? 结构体中所有成员占用字节的和。,sizeof(struct student) 10
5、6,2. 定义结构体类型变量的方法,说明: 类型与变量是不同概念; 结构体成员可以单独使用; 成员也可以是结构体变量; 成员名称可以与程序中的其它变量名称相同,是两个不同的对象。,struct student unsigned int No; char name32; unsigned short age; float score; struct data birthday; stu1, stu2;,struct data int month; int day; int year; ;,3. 结构体变量的引用,结构体变量中成员的引用: 结构体变量名.成员名 结构体指针变量中成员的引用: 结构体
6、指针变量名-成员名 不能将结构体变量作为一个整体进行输入/输出。只能对结构体变量中的各个成员分别进行输入和输出; 如果成员本身又是结构体类型,则要用若干个成员运算符,一级一级找到最低一级的成员。只能对最低级的成员进行运算; stu1.No stu1.birthday.month 结构体变量中的成员可以同其它变量一样进行运算; strcpy(stu1.name, “LiNa”); stu1.age+; 可以引用结构体变量中成员的地址,结构体变量的地址; scanf(“%d”, /输出stu1的首地址,用做函数参数,3. 结构体变量的引用,struct stu int num; char *nam
7、e; char sex; float score; ;,main() struct stu boy1,boy2; boy1.num=102; boy1.name=Zhang ping; printf(input sex and scoren); scanf(%c %f, ,4. 结构体变量的初始化,struct stu /*定义结构*/ int num; char *name; char sex; float score; ; main() struct stu boy2, boy1=102,Zhang ping,M,78.5; boy2=boy1; printf(Number=%dnName
8、=%sn,boy2.num, boy2.name); printf(Sex=%cnScore=%fn,boy2.sex, boy2.score); ,5. 结构体数组,定义: struct stu int num; char *name; char sex; float score; boy3; struct stu girl10;,定义: struct int num; char *name; char sex; float score; boy3;,5. 结构体数组,结构体数组的存储形态:,各个数组元素连续存放,5. 结构体数组,初始化: struct stu int num; char
9、*name; char sex; float score; boy5 = 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58 ;,可不写,struct stu int num; char *name; char sex; float score; ; struct stu boy5 = 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87,
10、 105,Wang ming,M,58 ;,=初值列表,5. 结构体数组,【例】计算学生的总平均成绩 和统计大于90分的人数。 struct stu int num; char *name; char sex; float score; boy5= 101,Li ping,M,45, 102,Zhang ping,M,62.5, 103,He fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,86 ;,main() int i, c=0; float ave, s=0; for(i=0; i90) c+=1; printf(s=%fn,s);
11、ave=s/5; printf(average=%fn“, ave); printf(“count=%dn, c); ,5. 结构体数组,【例】建立同学通讯录 #include #define NUM 3 struct mem char name20; char phone10; ;,main() struct mem manNUM; int i; for(i=0; iNUM; i+) printf(input name:n); gets(mani.name); printf(input phone:n); gets(mani.phone); printf(nametttphonenn); f
12、or(i=0;iNUM;i+) printf(%sttt%sn, mani.name,mani.phone); ,5. 结构体数组,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,leaderj.name)=0) leaderj.count+; printf(n); for(i=0;i3;i+) printf(%s:%dn,leaderi.name,leaderi.count); ,【例】对候选人得票的统计程序 #
13、include #include #include struct person char name20; int count; leader3=Li,0,Zhang,0,Fun,0;,6. 指向结构体类型数据的指针,指向结构体变量的指针; 指向结构体数组的指针; 结构体变量和结构体指针变量作函数参数。,【例】 struct stu int num; char *name; char sex; float score; boy, *pboy; struct stu *pstu; pboy = ,结构体指针变量说明的一般形式为: struct 结构体名 *结构体指针变量名 结构体指针必须先赋值才能
14、使用 pboy = 有了结构体指针变量,就能更方便地访问结构变量的各个成员。其访问的一般形式为: (*结构指针变量).成员名 或为: 结构指针变量-成员名,6. 指向结构体类型数据的指针,指向结构体变量的指针; 指向结构体数组的指针; 结构体变量和结构体指针变量作函数参数。,struct stu int num; char *name, sex; float score; boy1=102, 李平,M,78.5, *pstu; main() pstu= ,注意: pstu-num pstu-num+ (pstu-num)+ +pstu-num +(pstu-num),6. 指向结构体类型数据的
15、指针,指向结构体数组的指针; 结构体变量和结构体指针变量作函数参数。,struct stu int num; char *name, sex; float score; boy5= 101,Zhou ping,M,45, 102,Zhang ping,M,62.5, 103,Liou fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58 ;,main() struct stu *ps; printf(NotNametttSextScoretn); for(ps=boy; psnum,ps-name,ps-sex,ps-score); ,ps=boy; = boy0 ps+1 = boy1 ps+4 = boy4 (+ps)-num ? (ps+)-num ? 二者区别,101,“Li ping”,M,45,102,“Zhang ping”,M,62.5,103,“Liou fang”,boy0,boy1,boy2,p,p+1,pstu是指向结构的指针,若要 指向 某个成员,必须强制类型 转换 pstu=(struct stu*)boy1.name; printf( Name=%sn,pstu); Name=Zhang ping,6. 指向结构体类型数据的指针,