《结构体和共用体课件.ppt》由会员分享,可在线阅读,更多相关《结构体和共用体课件.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、结构体和共用体结构体和共用体第1页,此课件共53页哦结构体(结构体(structure)是一种数据类型,)是一种数据类型,它把互相联系的数据组合成一个整体它把互相联系的数据组合成一个整体。例、。例、第2页,此课件共53页哦 一个学生的学号、姓名、性别、年龄、成绩、地址,是一个学生的学号、姓名、性别、年龄、成绩、地址,是互相联系的数据,在互相联系的数据,在C语言中用语言中用“结构体(结构体(structure)”来定义。来定义。struct studentintnum;/*学号学号*/char name20;/*姓名姓名*/char sex;/*性别性别*/int age;/*年龄年龄*/flo
2、at score;/*成绩成绩*/char addr30;/*地址地址*/;第3页,此课件共53页哦11.2 结构体变量的定义结构体变量的定义 结构体是一种数据类型结构体是一种数据类型(像(像int、char、flaot数据类型一样),数据类型一样),可以用它定义变量。可以用它定义变量。用结构体类型定义变量的方式有三种:用结构体类型定义变量的方式有三种:第4页,此课件共53页哦一、先定义结构体类型,再定义变量一、先定义结构体类型,再定义变量例、例、struct studentintnum;char name20;char sex;int age;float score;char addr30;
3、;struct student student1,student2;第5页,此课件共53页哦 结构体变量中的各成员,在内存中顺序存放。结结构体变量中的各成员,在内存中顺序存放。结构体变量所占内存大小用运算符构体变量所占内存大小用运算符sizeof计算。计算。例、例、printf(%d%d n,sizeof(struct student),sizeof(student1);第6页,此课件共53页哦为了方便,可以这样定义结构体变量:为了方便,可以这样定义结构体变量:#define STUDENT struct studentSTUDENTintnum;char name20;char sex;in
4、t age;floatscore;char addr30;;STUDENT student1,student2;第7页,此课件共53页哦二、在定义类型的同时定义变量二、在定义类型的同时定义变量struct studentintnum;char name20;char sex;int age;floatscore;char addr30;student1,student2;第8页,此课件共53页哦三、直接定义变量三、直接定义变量struct intnum;char name20;char sex;int age;float score;char addr30;student1,student2;
5、第9页,此课件共53页哦四、成员是另一个结构体变量四、成员是另一个结构体变量struct date int month;int day;int year;;struct studentintnum;char name20;char sex;int age;struct date birthday;char addr30;student1,student2;第10页,此课件共53页哦第11页,此课件共53页哦11.3 结构体变量的引用结构体变量的引用1、一般情况下,不能将一个结构体变量作为整体来引用,只能、一般情况下,不能将一个结构体变量作为整体来引用,只能引用其中的成员(分量)。引用结构体成员
6、的方式:引用其中的成员(分量)。引用结构体成员的方式:结构体变量名结构体变量名.成员名成员名.是是“成员运算符成员运算符”例例1、printf(%d,%s,%c,%d,%f,%s,student1.num,student1.name,student1.sex,student1.age,student1.score,sutdent1.addr);printf(%d,%s,%c,%d,%f,%s,student1);第12页,此课件共53页哦例例2、student2.score=student1.score;sum=student1.score+student2.score;student1.ag
7、e+;+student1.age;例例3、scanf(%d,&student1.num);第13页,此课件共53页哦2、当成员是另一个结构体变量时,应一级、当成员是另一个结构体变量时,应一级一级地引用成员。一级地引用成员。例例4、student1.num;student1.name;student1.birthday.month;student1.birthday.day;student1.birthday.year;第14页,此课件共53页哦3、仅在以下两种情况下,可以把结构体变、仅在以下两种情况下,可以把结构体变量作为一个整体来访问。量作为一个整体来访问。(1)结构体变量整体赋值,例、结构
8、体变量整体赋值,例、student2=student1;(2)取结构体变量地址,例、)取结构体变量地址,例、printf(%x,&student1);返回本章目录返回本章目录第15页,此课件共53页哦11.4 结构体变量的初始化结构体变量的初始化struct studentlong int num;char name20;char sex;char addr20;a=89031,Li Lin,M,123 Beijing Road;注意:不能在结构体内赋初值。注意:不能在结构体内赋初值。例、例、struct studentlong int num=89031;char name20=Li Lin
9、;char sex=M;char addr30=123 Bejing Road;a;第16页,此课件共53页哦11.5 结构体数组结构体数组一、结构体数组的定义一、结构体数组的定义struct studentint num;char name20;char sex;int age;float score;char addr30;struct student stu3;第17页,此课件共53页哦第18页,此课件共53页哦二、结构体数组的初始化二、结构体数组的初始化 (见课本(见课本P266)struct studentint num;char name20;char sex;int age;fl
10、oat score;char addr30;stu3=10101,Li Lin,M,18,87.5,103 Bejing Road,10102,Zhang Fun,M,19,99,130 Shanghai Roaad,10104,Wang Min,F,20,78.5,1010 Zhongshan Road;第19页,此课件共53页哦三、举例三、举例例例11.2对候选人得票的统计程序。设有对候选人得票的统计程序。设有三个候选人,每次输入一个得票的候选三个候选人,每次输入一个得票的候选人的名字,要求最后输出各候选人得票人的名字,要求最后输出各候选人得票结果。结果。运行运行第20页,此课件共53页哦
11、11.6 结构体指针结构体指针一、结构体指针一、结构体指针结构体指针:指向结构体变量的指针。例、结构体指针:指向结构体变量的指针。例、第21页,此课件共53页哦struct studentlong int nnum;char name20;char sex;floatscore;struct student stu_1;struct student*p;p=&stu_1;第22页,此课件共53页哦 结构体指针,通过指向运算符结构体指针,通过指向运算符引用结引用结构体中的成员。例、构体中的成员。例、p-nump-namep-sexp-score因此结构体成员的引用方式有以下三种:因此结构体成员的
12、引用方式有以下三种:结构体变量结构体变量.成员名成员名 (*p).成员名成员名 p-成员名成员名第23页,此课件共53页哦三、指向结构体数组的指针三、指向结构体数组的指针 例例1:struct student stu3;struct student*p=stu;p+;p+;第24页,此课件共53页哦 struct student stu3;struct student*p;p=stu;p-num;p+;p-num;p+;p-num;第25页,此课件共53页哦三、用结构指针作函数的参数三、用结构指针作函数的参数 例例11.511.5有一个结构体变量有一个结构体变量stustu,内含,内含学生学号
13、、姓名和三门课程的成绩。要学生学号、姓名和三门课程的成绩。要求在求在mainmain中赋初值,在函数中赋初值,在函数printprint中打印中打印输出。输出。运行运行第26页,此课件共53页哦说明:说明:1、结构体的成员作函数的参数。、结构体的成员作函数的参数。与普通变量作函数参数的用法相同。值传送,不能修改实与普通变量作函数参数的用法相同。值传送,不能修改实参的值。参的值。2、结构体指针作函数的参数。、结构体指针作函数的参数。将结构体的地址传送给函数,效率高,可以修改实将结构体的地址传送给函数,效率高,可以修改实参的值。参的值。3、结构体作函数的参数。、结构体作函数的参数。将结构体的全部成
14、员值传送给函数,效率低,不能将结构体的全部成员值传送给函数,效率低,不能修改实参的值。修改实参的值。第27页,此课件共53页哦四、举例四、举例 例例11.6 有有4个学生,每个学生包括学号、个学生,每个学生包括学号、姓名和成绩。要求找出成绩最高者的姓姓名和成绩。要求找出成绩最高者的姓名和成绩。名和成绩。返回本章目录返回本章目录运行运行第28页,此课件共53页哦11.8 共用体共用体一、共用体的概念一、共用体的概念 当需要把不同类型的变量存放到同一段内存单元,当需要把不同类型的变量存放到同一段内存单元,或对同一段内存单元的数据按不同类型处理,则需或对同一段内存单元的数据按不同类型处理,则需要使用
15、要使用“共用体共用体”数据结构。数据结构。例、把一个整型变量、一个字符型变量、一个实型例、把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。变量放在同一个地址开始的内存单元中。共用体的定义形式:共用体的定义形式:union 共用体名共用体名成员列表;成员列表;变量列表;变量列表;例、例、第29页,此课件共53页哦union dataint i;char ch;float f;第30页,此课件共53页哦注意区分:注意区分:“共用体共用体”:各成员占相同的起始地址,:各成员占相同的起始地址,所占所占内存长度等于最长的成员所占内存内存长度等于最长的成员所占内存。“结构体结构
16、体”:各成员占不同的地址,所占:各成员占不同的地址,所占内存长度等于全部成员所占内存之和。内存长度等于全部成员所占内存之和。第31页,此课件共53页哦二、共用体变量的引用二、共用体变量的引用只能引用共用体变量的成员,如、只能引用共用体变量的成员,如、union data a;a.i;a.ch;a.f;第32页,此课件共53页哦三、共用体类型数据的特点三、共用体类型数据的特点、共用体变量中的值是最后一次存放的共用体变量中的值是最后一次存放的成员的值,如:成员的值,如:a.i=1;a.ch=a;a.f=1.5;完成以上三个赋值语句后,共用体变量完成以上三个赋值语句后,共用体变量的值是的值是1.5,
17、而,而a.i=1和和a.ch=a已无意义。已无意义。第33页,此课件共53页哦、共用体变量不能初始化,例、共用体变量不能初始化,例、union dataint i;char ch;float f;a=1,a,1.5;第34页,此课件共53页哦 例例11.11 设有若干个人员的数据,其中有学生和设有若干个人员的数据,其中有学生和教师。学生数据包括:姓名、号码、性别、职业、教师。学生数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、职务。如图、职务。如图、分析:学生数据的分析:学生数据的class(班级班级)和教师数据的和教师
18、数据的position(职务职务)类型不同,但在同一表格中,使用类型不同,但在同一表格中,使用“共用体共用体”数据结构。数据结构。运行运行第35页,此课件共53页哦11.9 枚举类型枚举类型 如果一个变量只有几种可能的值,可以如果一个变量只有几种可能的值,可以定义为枚举类型。定义为枚举类型。“枚举枚举”:将变量可能的值一一列举出:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。来。变量的值只能取列举出来的值之一。第36页,此课件共53页哦用关键字用关键字enum定义枚举类型:例、定义枚举类型:例、enum weekday sun,mon,tue,wed,thu,fri,sat;we
19、ekday是枚举类型名,可以用于定义变量,是枚举类型名,可以用于定义变量,如、如、enum weekday workday,week_end;weekday=mon;week_end=sun;sun、mon、.、sat称为称为“枚举元素枚举元素”或或“枚举常量枚举常量”。第37页,此课件共53页哦说明:说明:1、枚举元素是常量。在编译器中,按定义的顺序取值、枚举元素是常量。在编译器中,按定义的顺序取值0、1、2、.。例、例、weekday=mon;printf(%d,weekday);输出整数输出整数1。2、枚举元素是常量,不是变量,因此不能赋值。、枚举元素是常量,不是变量,因此不能赋值。su
20、n=0;mon=1;但在定义枚举类型时,可以指定枚举常量的但在定义枚举类型时,可以指定枚举常量的 值,如、值,如、enum weekday sun=7,mon=1,tue,wed,thu,fri,sat;此时,此时,tue、wed、.的值从的值从mon的值顺序加的值顺序加1。如,。如,tue=2。第38页,此课件共53页哦3、枚举值可以作判断,例、枚举值可以作判断,例、if(weekday=mon).if(weekday sun).4、整型与枚举类型是不同的数据类型,不能直接、整型与枚举类型是不同的数据类型,不能直接赋值,如、赋值,如、workday=2;/*workday是枚举类型是枚举类型
21、*/但可以通过强制类型转换赋值,如、但可以通过强制类型转换赋值,如、workday=(enum weekday)2;第39页,此课件共53页哦例例11.12口袋里有红、黄、蓝、白、黑五种口袋里有红、黄、蓝、白、黑五种颜色的球若干个。每次从口袋中取出三个球,颜色的球若干个。每次从口袋中取出三个球,打印出三种不同颜色球的可能取法。打印出三种不同颜色球的可能取法。分析:球的颜色只可能取五种值,用枚举类型分析:球的颜色只可能取五种值,用枚举类型变量处理。变量处理。运行运行第40页,此课件共53页哦11.10 用用typedef定义类型定义类型一、概念一、概念 关键字关键字typedef用于定义一种新的
22、数据类型,它代表已有数据用于定义一种新的数据类型,它代表已有数据类型,是已有数据类型的别名。例、类型,是已有数据类型的别名。例、typedef int INTEGER;typedef float REAL;定义新数据类型定义新数据类型INTEGER,它代表已有数据类型,它代表已有数据类型int。定义新数据类型定义新数据类型REAL,它代表已有数据类型它代表已有数据类型float。通过上述定义后,以下两行等价:通过上述定义后,以下两行等价:int i,j;float a,b;INTEGER i,j;REALa,b;第41页,此课件共53页哦二、典型用法:二、典型用法:1、定义一种新数据类型,专用
23、于某种类型、定义一种新数据类型,专用于某种类型的变量,使程序更清晰明了。的变量,使程序更清晰明了。例例1、typedef unsigned int size_t size_t size;/*定义定义size为无符号整型变为无符号整型变量量*/例例2、typedef int COUNT COUNT i,j;第42页,此课件共53页哦2、简化数据类型的书写。、简化数据类型的书写。例例3、typedef structint month;int day;int year;DATE;DATE birthday;DATE*p;DATE d7;例例4、typdef unsigned int UINT;UIN
24、T i,j;第43页,此课件共53页哦三、定义新类型的更一般形式:三、定义新类型的更一般形式:(1)typedef int NUM100;/*申明申明NUM为整型数组类型为整型数组类型*/NUM n;/*n为整型数组变量为整型数组变量*/(2)typedef char*STRING;/*申明申明 STRING是字符指针类型是字符指针类型*/STRING p,s10;/*p是字符指针变量,是字符指针变量,s10是字符指针数组是字符指针数组*/第44页,此课件共53页哦(3)typedef int(*POINTER)();/*POINTER是指向函数的指针,该函数返回整型是指向函数的指针,该函数返
25、回整型*/POINTER p1,p2;/*定义定义p1,p2为指向函数的指针为指向函数的指针*/第45页,此课件共53页哦四、四、typedef 与与#define的区别的区别typedef int COUNT#define COUNT int typedef定义一种新的数据类型(定义一种新的数据类型(COUNT),它),它是已有类型(是已有类型(int)的别名。在编译时)的别名。在编译时COUNT类型类型与与int类型相同。类型相同。#define定义一个宏(定义一个宏(COUNT),),在预编译时,在预编译时,把字符串把字符串COUNT替换为字符串替换为字符串int。返回本章目录返回本章目
26、录第46页,此课件共53页哦补充练习:补充练习:1、若有以下说明和定义、若有以下说明和定义typedef int*INTEGER;INTEGER p,*q;以下叙述正确的是:(以下叙述正确的是:()A)p是是int型变量型变量B)p是基类型为是基类型为int 的指针变量的指针变量C)q是基类型为是基类型为int 的指针变量的指针变量D)程序中可用)程序中可用INTEGER代替代替int类型名类型名B第47页,此课件共53页哦2、设有以下说明语句、设有以下说明语句typedef struct int n;char ch8;PER;则以下叙述中正确的是则以下叙述中正确的是A)PER是结构体变量名是
27、结构体变量名B)PER是结构体类型名是结构体类型名C)typedef struct是结构体类型是结构体类型D)struct是结构体类型名是结构体类型名B第48页,此课件共53页哦3、以下程序的输出是以下程序的输出是A)10 B)11 C)51 D)60struct st int x;int*y;*p;int dt4=10,20,30,40;struct st aa4=50,&dt0,60,&dt0,60,&dt0,60,&dt0,;main()p=aa;printf(%dn,+(p-x);C第49页,此课件共53页哦本章要求及作业本章要求及作业 、结构体的概念,结构体指针,结构、结构体的概念,结构体指针,结构体数组。体数组。2、共用体的概念。、共用体的概念。3、枚举类型。、枚举类型。4、typedef定义新数据类型。定义新数据类型。作业:作业:11.1 第50页,此课件共53页哦第51页,此课件共53页哦第52页,此课件共53页哦第53页,此课件共53页哦
限制150内