《第8章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《第8章结构体与共用体.ppt(36页珍藏版)》请在三一办公上搜索。
1、复习与总结:有关指针的数据类型,问题:,学生信息:学号、姓名、性别、年龄、成绩、住址一个学生信息的处理:定义6个变量一个班(30人)学生信息的处理:定义 180(6*30)个变量?五个班(150人)学生信息的处理:定义 900(6*150)个变量?解决方法:能否将学生信息(包含6个不同类型的数据)作为一个整体进行处理?,结构体数据类型,第8章 结构体与共用体,第8章 结构体与共用体,8.1 结构体数据类型8.2 共用体数据类型8.3 枚举类型8.4 自定义类型,8.1 结构体数据类型,数组:将相同类型的数据组合成一个有机的整体。结构体:将不同类型的数据组合成一个有机的整体,用户可以根据需要指定
2、数据结构(结构体)的组成。说明:结构体数据类型和系统提供的标准类型具有同等的地位和作用,都可用来定义变量的类型。,如何定义结构体数据类型?,8.1.1 结构体类型定义,结构体数据类型的定义:struct 结构体名 成员列表;结构体数据成员的定义:类型名 成员名;,struct student int num;char name20;char sex;int age;float score;char addr30;,结构体类型数据的存储:大小:各成员所占内存单元之和。顺序:一段连续存储单元中依次存储各成员数据。,8.1.1 结构体类型定义,结构体类型数据的说明:1.类型与变量是不同的概念。2.对
3、结构体中的成员(即域,也称分量),可以单独使用,其作用与地位相当于普通变量。3.成员名可以与程序中的变量名相同,互不影响。4.成员类型也可以是一个结构体类型。,8.1.1 结构体类型定义,如:struct date int month,day,year;struct student int num;char name20;char sex;struct date birthday;char addr30;,结构体类型数据的成员类型:说明:成员类型也可以是一个结构体类型。,8.1 结构体数据类型,既然结构体是一种新的数据类型,那么就会有具有结构体数据类型的数据:结构体类型的变量结构体类型的数组结
4、构体类型的指针进一步的可以用结构体类型数据作函数参数,结构体类型的变量,8.1.2 结构体类型的变量,结构体类型变量的定义:1.先声明结构体类型再定义变量:如:struct student stud1,stud2;,2.在声明结构体类型的同时定义变量:struct 结构体名 成员列表 变量名列表;3.直接定义结构体类型变量:struct 成员列表 变量名列表;,8.1.2 结构体类型的变量,结构体变量成员的引用:成员(分量)运算符:.引用形式:结构体变量名.成员名1.不能将结构体变量作为一个整体进行输入和输出;只能对结构体变量中的各个成员分别进行输入和输出 如:printf(%d,%s,%c,
5、%d,%f,%s,stud1);printf(%d,stud1.num);,2.若成员本身是一个结构体类型,则要使用多个成员运算符 如:stud1.birthday.day=5;3.对结构体变量的成员可以像普通变量一样进行各种运算 如:stud1.sex=stud2.sex;stud1.age+;4.可引用结构体变量成员的地址,也可引用结构体变量的地址 如:scanf(%d,/*输出stud1的首地址*/,错 误 正 确,8.1.2 结构体类型的变量,stuct student long int num;char name20;char sex;char addr30;main()struct
6、 student s=99301,Zhang san,M,No.4 Jinhua Road;printf(NO.:%ldnname:%snsex:%cnaddress:%sn,s.num,s.name,s.sex,s.addr);,结构体类型变量的初始化:,8.1 结构体数据类型,既然结构体是一种新的数据类型,那么就会有具有结构体数据类型的数据:结构体类型的变量结构体类型的数组结构体类型的指针进一步的可以用结构体类型数据作函数参数,结构体类型的数组,8.1.3 结构体类型的数组,定义结构体数组:如:struct student stu3;stu0.age=19;stu1.score=93.0;
7、stu2.sex=M;结构体数组初始化:,struct student int num;char name20;char sex;int age;float score;char addr30;,如:struct student stu3=99301,Zhangsan,M,18,93.0,No.4 Jinhua Road,99312,Lisi,M,20,76.0,No.102 Lianhu Road,99327,Susan,F,19,87.0,No.32 Heping Road;,8.1 结构体数据类型,既然结构体是一种新的数据类型,那么就会有具有结构体数据类型的数据:结构体类型的变量结构体类
8、型的数组结构体类型的指针进一步的可以用结构体类型数据作函数参数,结构体类型的指针,结构体变量指针:该变量所占内存单元的起始地址指向结构体变量的指针:保存结构体变量的起始地址,stud.num,stud.name,stud.sex,stud.score,8.1.4 结构体类型的指针,1.引用结构体变量的成员:结构体变量名.成员名,#include string.hstruct student long num;char name20;char sex;float score;/*输出结构体变量的各个成员值*/main()struct student stud,*p=,(*p).num,(*p).
9、name,(*p).sex,(*p).score);,p-num,p-name,p-sex,p-score);,2.通过结构体指针引用:(*p).成员名,3.通过结构体指针引用:p-成员名,8.1.4 结构体类型的指针,struct student long num;char name20;char sex;float score;char addr30;,main()struct student stu3=99301,Zhangsan,M,93.0,No.4 Jinhua Road,99312,Lisi,M,76.0,No.102 Lianhu Road,99327,Susan,F,87.0
10、,No.32 Heping Road;struct student*p;printf(No.Name Sex Score Addressn);for(p=stu;p num,p-name,p-sex,p-score,p-addr);,8.1 结构体数据类型,既然结构体是一种新的数据类型,那么就会有具有结构体数据类型的数据:结构体类型的变量结构体类型的数组结构体类型的指针进一步的可以用结构体类型数据作函数参数,结构体类型数据作函数参数,8.1.5 结构体类型数据作函数参数,8.1.5 结构体类型数据作函数参数,#include string.h#define FORMAT%ldn%sn%fn%f
11、n%fnstruct student long num;char name20;float score3;,void structprint(struct student s)printf(FORMAT,s.num,s.name,s.score0,s.score1,s.score2);main()struct student stu=12345,Zhangsan,67.5,87,78.5;structprint(stu);,void structprint(struct student*s)printf(FORMAT,s-num,s-name,s-score0,s-score1,s-score
12、2);main()struct student stu=12345,Zhangsan,67.5,87,78.5;structprint(,问题:,能否用统一的数据形式保存学生和教师的信息?学生信息:学号、姓名、性别、身份、所在班级教师信息:学号、姓名、性别、身份、所在单位问题分析:学生信息与教师信息不同之处在于:学生所在班级信息为整型 教师所在单位信息为字符串解决方法:是否存在一种数据类型,既可以用来保存整型数据,又可以用来保存字符串?,共用体数据类型,第8章 结构体与共用体,8.1 结构体数据类型8.2 共用体数据类型8.3 枚举类型8.4 自定义类型,8.2 共用体数据类型,共用体:使几种
13、不同类型的变量存放到同一段内存单元中。共用体数据类型的定义形式:union 共用体名 成员列表;例如:union data int i;char ch;float f;,8.2 共用体数据类型,union data int i;char ch;float f;a;,共用体与结构体数据类型的区别:,8.2 共用体数据类型,共用体变量的使用方式与结构体变量的使用方式相同,通过成员运算符引用其成员(如:a.i、a.ch)。共用体变量使用说明:1.任一时刻只有一个成员起作用。2.共用体变量的地址和其各成员的地址是同一地址。3.共用体变量赋值:不能对共用体变量名赋值;不能企图引用共用体变量来得到一个值;
14、不能在定义共用体变量时进行初始化。,8.2 共用体数据类型,共用体变量使用说明:4.共用体成员的数据类型:基本数据类型、数组、指针、结构体 5.共用体变量不能用作函数的参数 共用体变量的成员可以用作函数的参数。6.可以使用指向共用体变量的指针 7.可以定义共用体数组 8.共用体类型可以作为结构体成员的类型。,8.2 共用体数据类型,用统一的数据形式保存学生和教师的信息:,main()int n,i;for(i=0;i 3;i+)scanf(%d%s%c%c,/*根据不同职业输出不同信息*/,struct person int num;char name20;char sex;char job;
15、union int class;char position10;ctg;ps3;,问题:,常用的颜色(黑、白、红、黄、蓝、绿)如何表示?解决方案:1,2,3,4,5,6 特点:简单但不直观,且易于出错改进方案:1.能否用符号表示?如:Black、White、Red、Yellow、Blue、Green2.能否将其作为一种数据类型,其取值仅限于以上六种符号?,枚举类型,第8章 结构体与共用体,8.1 结构体数据类型8.2 共用体数据类型8.3 枚举类型8.4 自定义类型,8.3 枚举类型,枚举:将变量值列举出来,变量值只限于列举出来的值 当一个变量只有几种可能的值,可定义为枚举类型枚举类型的定义形
16、式:enum 枚举类型名 枚举元素列表;例如:enum color Black,White,Red,Yellow,Blue,Green;enum weekday sun,mon,tue,wed,thu,fri,sat;枚举类型变量的定义:enum 枚举类型名 变量名;例如:enum weekday workday,weekend;workday=mon;weekend=fri;,8.3 枚举类型,枚举类型说明:1.枚举元素是用户定义的标识符,其含义由程序员决定 2.在C编译中,枚举元素按常量处理,故又称枚举常量 3.枚举元素作为常量是有值的,系统按顺序使其值为0,1,2 如:enum week
17、day sun,mon,tue,wed,thu,fri,sat;其中:sun 的值为 0,mon 的值为 1,sat 的值为 6 也可以定义枚举类型时由程序员指定 如:enum weekday sun=7,mon=1,tue,wed,thu,fri,sat;则sun 值为7,mon值为1,其后元素顺序加1,sat值为6 4.枚举元素可用来作判断比较:如 workday=mon 5.一个整数不能直接赋值给一个枚举变量 如:workday=(enum weekday)2;,问题:,struct student st;即变量 st 的数据类型为 struct student 1.数据类型为 stru
18、ct student 能否用student_type 表示?2.对已经存在的数据类型,能否针对个人习惯使用其他的标识符表示?,数据类型重命名,第8章 结构体与共用体,8.1 结构体数据类型8.2 共用体数据类型8.3 枚举类型8.4 自定义类型,8.4 自定义类型,数据类型重命名:声明新的类型名用来代替已经存在的类型名(原类型名仍有效)声明形式:typedef 已存在的类型名 新的类型名;例如:typedef int INTEGER;typedef float REAL;则:int i,j;等价于 INTEGER i,j;float a,b;等价于 REAL a,b;,8.4 自定义类型,又如:typedef struct int month,day,year;DATE;DATE birthday,*p;例如:typedef int NUM10;/*声明NUM为整型数组类型*/typedef char*STRING;/*声明STRING为字符指针类型*/typedef int(*POINTER)()/*声明POINTER为指向函数的指针类型*/NUM n;STRING sp,s10;POINTER p1,p2;,第8章 结构体与共用体,8.1 结构体数据类型8.2 共用体数据类型8.3 枚举类型8.4 自定义类型,