• / 65
  • 下载费用:10 金币  

第十章结构体与共用体.ppt

关 键 词:
第十章结构体与共用体.ppt
资源描述:
目 录,结构体 结构体数组 指向结构体的指针 定义类型别名 动态存储分配函数,结构体概述,结构体 将不同类型的数据组合成一个整体 用来表示简单类型无法描述的复杂对象 可以用结构体来定义用户自己的数据结构 举例 描述学生信息,结构体类型的声明,一般形式 struct [结构体名]{成员表列}; “成员表列”形式类型 成员名;类型 成员名;. .,结构体类型的声明举例,struct student {unsigned num; /* 学号 */char name[20]; /* 姓名 */char sex; /* 性别 */unsigned age; /* 年龄 */float score; /* 分数 */char addr[50]; /* 地址 */ };,结构体类型声明的说明 (1),声明了一种类型,而不是定义变量 结构体名可以没有,但是这样就无法再次使用该结构体类型了 成员表列中是成员(Member)的定义 成员的定义形式与变量定义相同 成员类型可以是另一结构体类型,但不可直接或间接递归嵌套 成员表列不可为空,至少要有一个成员,结构体类型声明的说明 (2),注意{}不表示复合语句,其后有分号 同一结构体的成员不能重名 不同结构体的成员可以重名 结构体成员和其他变量可以重名 结构体类型与其成员或其他变量可重名 struct test { int test; } test; 结构体类型名称是struct 结构体名,注意struct关键字不能省略,结构体类型声明的说明 (3),即使两个结构体声明中的成员类型、名称、顺序都完全一致,它们也是不同的类型 结构体类型要“先声明,后使用” 如果结构体类型声明在函数内部,则该函数之外无法引用此结构体类型 一般把结构体类型声明放到文件最前面 也可以把结构体类型声明放在头文件里,结构体变量的定义 (1),先声明结构体类型再定义变量,struct student {unsigned num;char name[20];char sex;unsigned age;float score;char addr[50]; }; struct student stu1, stu2;,结构体变量的定义 (2),在声明结构体类型的同时定义变量,struct student {unsigned num;char name[20];char sex;unsigned age;float score;char addr[50]; } stu1, stu2;,结构体变量的定义 (3),直接定义无名结构类型变量,struct {unsigned num;char name[20];char sex;unsigned age;float score;char addr[50];} stu1, stu2;,结构体声明和变量定义举例,struct date {int year, month, day;}; struct student{unsigned num;char name[20];char sex;struct date birthday;float score; } stu1, stu2;,结构体变量的初始化,按照成员的顺序和类型对成员初始化,struct student{ int no; char name[20]; char sex; int age; char pno[19];char addr[40]; char tel[20];}student1={11301,“Zhang Ping“,'F',19,“320406841001264“,“changzhou“,“(0519)8754267“};,结构体变量的初始化,按照成员的顺序和类型对成员初始化,struct date date1 = {1984, 10, 20}; struct student stu = {1001, /*unsigned num*/“Tom“, /*char name[20]*/'M', /*char sex*/{1983, 9, 20},/*struct date birthday*/93.5 /*float score*/};,结构体变量中成员的引用,一般形式 结构体变量名.成员名 成员运算符 . 具有最高的优先级,自左向右结合 说明 结构体变量不能作为一个整体输入输出. 结构体成员和同类型的变量用法相同 若成员类型又是一个结构体,则可以使用若干个成员运算符,访问最低一级的成员,结构体变量中成员的引用举例,struct student stu; . . scanf(“%f“, ,结构体变量整体引用,结构体类型变量之间可以直接相互赋值 实质上是两个结构体变量相应的存储空间中的所有数据直接拷贝 包括复杂类型在内的所有结构体成员都被直接赋值,如字符串、结构体类型等 函数的实参和形参可以是结构体类型,并且遵循实参到形参的单向值传递规则 为了提高程序的效率,函数的参数可使用结构体类型指针,结构体变量整体引用举例,struct student stu1, stu2={1002, “Kate“, 'F',{1981, 11, 4}, 89.0}; void print(struct student s) { printf(“%d,%4s,%c,%d.%2d.%2d,%4.1f\n“,s.num, s.name, s.sex, s.birthday.year,s.birthday.month, s.birthday.day, s.score); } void main () { stu1 = stu2; /* 直接赋值 */print(stu1); /* 1002,Kate,F,1981.11.04,89.0 */ },结构体数组,结构体数组的用法与基本类型数组类似 定义、初始化、引用等 结构体数组可用于表示二维表格 举例,struct student s[10];\*表示定义了一个数组s,数组s有10个元素,每个元素都是struct student类型数据. \* for (i=0; i10; i++)scanf(“%d,%s,%c,%d,%f“,,结构体数组初始化及应用举例,struct student stu[] = {{1001,“Tom“,'M',{1980,1,2},85.5},{1002,“Kate“,'F',{1981,11,4},89.0},{1003,“Mike“,'M',{1980,3,5},95.5}}; for (i=0; i3; i++)printf(“%d,%4s,%c,%d,%2d,%2d,%4.1f\n“,stu[i].num, stu[i].name,stu[i].sex, stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day, stu[i].score);,结构体数组与二维表,struct student s[5];,,,结构体,一维数组,结构体数组应用举例,结构体数组应用P287例11.2,指向结构体的指针,指向结构体的指针 定义、使用与其他基本类型指针类似 可以使用指向运算符(-)引用指针所指向的结构体的成员 指向运算符 - 结构体指针-成员名 具有最高的优先级,自左向右结合 若struct student stu, *p=则stu.num、(*p).num、p-num等效p289例11.3自己看,指向结构体数组的指针,指向结构体数组的指针 与指向其他基本类型数组的指针用法类似 注意相关运算符的结合方向和优先级,举例:课本P290页 struct student stu[10], *p=stu; (++p)-n; p先自加1,然后得到它指向的元素中的n成员值 (p++)-n; 先得到它指向的元素中的n成员值,然后p自加1. p-n++; 先得到它指向的元素中的n的成员值,用完该值后使它加1. ++p-n; 得到p指向的结构体变量中的成员n的值加1,然后再使用它,结构体指针作函数参数举例,void input(struct student *p) { scanf(“%d %s %c %d.%d.%d %f“,},例:有n个结构体变量,内含学生学号、 姓名和3门课程的成绩。要求输出平均成 绩最高的学生的信息(包括学号、姓名、3 门课程成绩和平均成绩)。,解题思路:将n个学生的数据表示为结构体数组。按照功能函数化的思想,分别用3个函数来实现不同的功能: 用input函数输入数据和求各学生平均成绩 用max函数找平均成绩最高的学生 用print函数输出成绩最高学生的信息 在主函数中先后调用这3个函数,用指向结构体变量的指针作实参。最后得到结果。 本程序假设n=3,#include #define N 3 struct Student { int num; char name[20]; float score[3]; float aver; };,4个成员,输入前3个成员值,,计算最后成员值,void main() { void input(struct Student stu[]); struct Student max(struct Student stu[]); void print(struct Student stu); struct Student stu[N],*p=stu; input(p); print(max(p)); },void input(struct Student stu[]) { int i;printf(“请输入各学生的信息:学号、姓名、三门课成绩:\n“);for(i=0;iN;i++){scanf(“%d %s %f %f %f“,}},输入第1个成员值,输入第2个成员值,stu[0],stu[1],stu[2],stu,10101,Li,78 89 98,88.33,i=0,void input(struct Student stu[]) { int i;printf(“请输入各学生的信息:学号、姓名、三门课成绩:\n“);for(i=0;iN;i++){scanf(“%d %s %f %f %f“,}},输入第1个成员值,输入第2个成员值,stu[0],stu[1],stu[2],stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,i=1,void input(struct Student stu[]) { int i;printf(“请输入各学生的信息:学号、姓名、三门课成绩:\n“);for(i=0;iN;i++){scanf(“%d %s %f %f %f“,} },输入第1个成员值,输入第2个成员值,stu[0],stu[1],stu[2],stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,i=2,struct Student max(struct Student stu[]) {int i,m=0; for(i=0;istu[m].aver) m=i; return stu[m]; },stu[0],stu[1],stu[2],stu,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,最大,,返回,void print(struct Student stud) { printf(“\n成绩最高的学生是:\n“);printf(“学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n”, stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.aver);},stud,10101,Li,78 89 98,88.33,10103,Wang,98.5 87 69,84.83,10106,Sun,88 76.5 89,84.5,,num,name,score,,aver,stu[0],stu[1],stu[2],以上3个函数的调用,情况各不相同: 调用input函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数无返回值。 调用max函数时,实参是指针变量,形参是结构体数组,传递的是结构体元素的地址,函数的返回值是结构体类型数据。 调用print函数时,实参是结构体变量,形参是结构体变量,传递的是结构体变量中各成员的值,函数无返回值。,定义类型别名,1、使用typedef关键词可以定义一种新的类型名代替已有的类型名。例如:typedef int INTEGER;typedef float REAL;INTEGER i,j; REAL a,b;,定义类型别名,2、类型定义的典型应用: (1)定义一种新数据类型,作简单的名字替换。 例如:typedef unsigned int UINT; /* 定义UINT是无符号整型类型 */UINT u1; /* 定义UINT类型(无符号整型)变量u1 */,定义类型别名,(2)简化数据类型的书写。 typedef struct {int month; int day; int year; }DATE; /* 定义DATE是一种结构体类型 */DATE birthday,*p,d[7]; /* 定义DATA(结构体类型)类型的变量: birthday,p,d */,定义类型别名,又如:typedef struct stu{ char name[20];int age;char sex;} STU;定义STU表示stu的结构类型,然后可用STU来说明结构变量:STU body1,body2;注意:用typedef定义的结构体类型不需要struct关键词,简洁。,定义类型别名,(3)定义数组类型int a[10],b[10],c[10],d[10];typedef int NUM[10]; /* 定义NUM是含10个整型数据的数组(存放10个整数)*/NUM n; /* 相当于int n[10],定义的数组变量的类型用一个新的名字NUM表示出来*/ (4)定义指针类型 typedef char *STRING; /* 定义STRING是字符指针类型 */ STRING p; /* 定义STRING类型(字符指针类型)的变量p */,作业:,1、设有以下语句 typedef struct S { int g; char h;} T; 则下面叙述中正确的是() A) 可用S定义结构体变量 B)可以用T定义结构体变量 C)S是struct类型的变量 D)T是struct S类型的变量,作业:,2.以下选项中不能正确把cl定义成结构体变量的是 A)typedef struct B)struct color cl { int red; { int red; int green; int green; int blue; int blue; } COLOR; }; COLOR cl; C)struct color D)struct { int red; { int red; int green; int green; int blue; int blue; } cl; } cl;,作业:,3. 以下程序的运行结果是 # include typedef struct student{ char name[10];long sno; float score; }STU; void main( ) { STU a={“zhangsan”,2001,95},b={“Shangxian”,2002,90},c={“Anhua”,200 3,95},d,*p= },2002Shangxian,作业:,4.有以下程序 struct s { int x,y; } data[2]={10,100,20,200}; main() { struct s *p=data; printf(“%d\n“,++(p-x)); } 程序运行后的输出结果是 A)10 B)11 C)20 D)21,作业:,5. 有以下程序 struc STU { char name[10];  int num;}; void f1(struct STU c) { struct STU b={“LiSiGuo”,2042};  c=b;} void f2(struct STU *c) { struct STU b={“SunDan”,2044};  *c=b;} main( ) { struct STU a={“YangSan”,2041},b={“WangYin”,2043};  f1(a) ;f2(} 执行后的输出结果是 A)2041 2044 B)2041 2043 C)2042 2044 D)2042 2043,动态存储分配函数,动态分配存储 根据需要开辟或释放存储单元 相关函数 malloc函数 calloc函数 free函数 说明 应包含malloc.h或stdlib.h,malloc函数,函数原型 typedef unsigned size_t; void *malloc(size_t size); 参数 size:分配存储空间的字节数 返回值 若成功,返回指向分配区域起始地址的指针 若失败,返回NULL,calloc函数,函数原型 void *calloc(unsigned n,unsigned size);作用:在内存的动态存储区中分配n个长度为size的连续空间。函数返回一个指向分配起始地址的指针;若失败,返回NULL,free函数,函数原型 void free(void *ptr); 参数 ptr:要释放的内存区地址 说明 释放prt指向的内存区 释放后的内存区能够分配给其他变量使用,共用体,有时想用同一段内存单元存放不同类型的变量。 使几个不同的变量共享同一段内存的结构,称为 “共用体”类型的结构。,1000,1001,1002,1003,字符ch,,整 型 变 量 i,实 型 变 量 f,共用体,共用体类型定义的一般形式 union 共用体名 { 成员表列 }变量表列;  例如: union Data { int i; char ch;float f;  }a,b,c;,,union Data { int i;char ch;float f;  }; union Data a,b,c;,“共用体”与“结构体”的定义形式相似,但它们的含义是不同的。 结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度。,共用体,共用体数据的特点,例: 有若干个人员的数据,其中有学 生和教师。学生的数据中包括:姓名、 号码、性别、职业、班级。教师的数据 包括:姓名、号码、性别、职业、职务。 要求用同一个表格来处理。,解题思路: 学生和教师的数据项目多数是相同的,但有一项不同。现要求把它们放在同一表格中,解题思路: 如果job项为s,则第5项为class。即Li是501班的。如果job项是t,则第5项为position。Wang是prof(教授)。,解题思路: 对第5项可以用共用体来处理(将class和position放在同一段存储单元中),#include struct { int num; char name[10]; char sex; char job; union { int clas; char position[10]; }category; }person[2];,外部的结构体数组,共用体变量,#include union Categ { int clas; char position[10]; }; struct { int num; char name[10]; char sex; char job;union Categ category }person[2];,声明共用体类型,定义共用体类型变量,void main() {int i;for(i=0;i2;i++){scanf(“%d %s %c %c“,,for(i=0;i2;i++){if (person[i].job == ‘s’) printf(“%-6d%-10s%-4c%-4c%-10d\n“,person[i].num,person[i]. name,person[i].sex,person[i].job, person[i].category.clas);else printf(“%-6d%-10s%-4c%-4c%-10s\n“,person[i].num,person[i]. name,person[i].sex, person[i].job,person[i].category.position); } },枚举类型,枚举类型是一种基本数据类型,而不是一种构 造类型,因为它不能再分解为任何基本类型。1. 枚举类型定义的一般形式为:enum 枚举名{ 枚举值表 };,,枚举类型,2 . 枚举变量的说明枚举变量也可先定义后说明,同时定义说明或直 接说明。 enum weekday{ sun,mou,tue,wed,thu,fri,sat }; enum weekday a,b,c; 或者为: enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c; 或者为:enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;,,枚举类型变量的赋值和使用,枚举类型在使用中有以下规定: 1.枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值:sun=5;mon=2;sun=mon; 都是错误的。 2.枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6。,,枚举类型变量的赋值和使用,例: void main( ) {enum weekday { sun,mon,tue,wed,thu,fri,sat } a,b,c;a=sun;b=mon;c=tue;printf(“%d,%d,%d“,a,b,c);}说明:只能把枚举值赋予枚举变量,不能把元素的 数值直接赋予枚举变量。,,枚举类型变量的赋值和使用,如: a=sum;b=mon;是正确的。而:a=0;b=1;是错误的。如一定要把数值赋予枚举变量,则必须用强制类 型转换。如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:a=tue;还应该说明的是枚举元素不是字符常量也不是字 符串常量,使用时不要加单、双引号。,,结束,The End,
展开阅读全文
  微传网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
0条评论

还可以输入200字符

暂无评论,赶快抢占沙发吧。

关于本文
本文标题:第十章结构体与共用体.ppt
链接地址:https://www.weizhuannet.com/p-10071190.html
微传网是一个办公文档、学习资料下载的在线文档分享平台!

网站资源均来自网络,如有侵权,请联系客服删除!

 网站客服QQ:80879498  会员QQ群:727456886

copyright@ 2018-2028 微传网络工作室版权所有

     经营许可证编号:冀ICP备18006529号-1 ,公安局备案号:13028102000124

收起
展开