C语言用户自定义数据类型.ppt
《C语言用户自定义数据类型.ppt》由会员分享,可在线阅读,更多相关《C语言用户自定义数据类型.ppt(85页珍藏版)》请在三一办公上搜索。
1、第8章 用户自定义数据类型,本章内容,8.1 结构类型及其变量的定义8.2 结构数组8.3 结构和指针8.4 联合类型8.5 枚举类型,8.1.1结构类型的定义,一.结构类型的概念 前面的我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:当定义某一特定数据类型,就限定该类型变量的存储特性和取值范围。在日常生活中,我们常会遇到一些需要填写的登记表,如成绩表、通讯地址、员工信息等。其数据类型可能由性质不同的成员组成。,结构类型的概念,上表中数据是由员工的工作证号(number)、姓名(name)、性别(sex)、年龄(age
2、)、部门(department)、工资(wage)等数据项组成的,逻辑上相关的数据。在C语言中,将这种由多个不同类型的数据项组合在一起形成的数据类型,称为结构体类型。,我们可以创建如下的结构类型:struct staff 其中staff由用户命名 char number8;char name10;char sex;int age;char dep20;float wage2;以上定义了一个结构类型struct staff(与int 同地位),它包含了number、name、sex、age、dep、wage等不同类型的数据项。,结构类型的概念,1结构体类型说明的一般形式 struct 标识符 结
3、构成员列表;;说明:(1)struct是关键字,声明要定义一个结构类型,结构类型名用标示符命名,要“见名知义”;(2)成员列表给出n个成员声明,成员可以基本类型变量、数组,也可以是另一结构类型变量等,对每个成员必须作类型说明,成员之间用分号分隔;,二.结构体类型及结构体变量,学生的基本信息,包括学号、姓名、性别、年龄、班级、成绩等数据项。这些数据项描述了一个学生的几个不同侧面。,独立的变量:,struct student char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级
4、 float grade;/成绩,2.结构类型的几点说明,(1)对于结构类型,系统不会为之分配内存。只有在定义了结构变量后,系统才会分配内存单元给变量。(2)结构是由若干个数据项组成,每个数据项都属于一种已有定义的类型。每一个结构成员都不是独立的,它不是一般的变量,而是跟结构联系在一起。,struct Student int number char name9;int age;char sex;,int age;char sex;,同名的age和sex均不会有命名冲突问题,(3)结构类型可以嵌套定义。所谓嵌套定义是指在一个结构类型中可以包含另一个或一些结构类型,通常用于结构类型的成员是一个结构
5、变量的场合。,结构类型的几点说明,结构类型的几点说明,struct Student char name9;struct Birthday int year;int month;int day;birthday;char sex;,struct Student int number char name9;int age;char sex;,(4)允许省略结构类型名,即允许定义无类型名的结构类型。,struct int year;int month;int day;birthday;,无名的结构类型必须后随结构变量(如birthday)的定义,并且仅能一处使用,这种形式通常用于内嵌在结构类型中的结
6、构类型。,(5)可以用sizeof运算符来计算结构类型的长度(字节数)例如:printf(“%d”,sizeof(struct Student);结果为18,结构类型的几点说明,1.结构类型数据对象包括一般变量、指针、数组等,对于成为结构变量、结构指针、结构数组等可以在说明语句中用已定义的结构类型定义结构数据对象,也可以在定义结构类型的同时定义结构数据对象。,8.1.2结构类型数据对象的定义及初始化,struct date int month;int day;int year;,struct staff char number8;struct date birthday;char sex;,定
7、义了结构类型之后,还必须定义结构类型变量,类型与变量是不同的概念。,2结构类型变量的三种定义方式(1)在说明结构类型的同时,也定义了结构类型变量例如:struct book int num;char name60;float price;book1,books3;在说明结构类型名struct book的同时,定义了结构类型变量book1与结构类型数组books,数组books有三个元素:books0、books1、books2。,结构类型数据对象的定义及初始化,(2)先说明结构类型,再单独进行变量定义例如:struct staff char name10;char sex;float wage
8、2;.struct staff worker1,worker2;,(3)省略结构标识符,直接定义变量例如:struct/*此处没有标识符*/int month;char day;unsigned year;d5;没有标识符一定要在定义结构类型的同时定义变量。,结构类型数据对象的定义及初始化,定义了结构类型:struce Student 后定义不同变量的区别:struce Student s1,s2100,*s3=(2)结构类型的变量名不是地址.,结构类型数据对象的定义及初始化,3.结构类型变量的初始化可以在定义结构类型变量的同时对其初始化,其语法格式:struct 标识符 结构变量名=成员初始
9、化值表,struct Student int number char name9;struct int year;int month;int day;birthday;char sex;student1=1101,”lilin”,1985,8,1,M;,定义了结构数据对象,就可以访问其中的每一个成员。结构成员可以像基本变量那样使用,如赋值、输入输出、参加表达式的计算等,这些操作统称为对结构成员的访问。1、结构成员的表示 结构变量是由n个成员聚合而成的一个整体,要访问其中的一个成员,必须同时给出整体的名称和个体成员的名称。struct Student s1,s2100,*s3=s1是结构变量,用
10、来存放单个学生的信息 s2是结构数组,该数组包含100个类型是struct Student 的成员,这样的数组可以表示一个学生情况 s3是结构指针,存放struct Student 类型数据对象s1的内存首地址。,9.1.3结构成员的引用,(1)结构变量成员的表示:结构变量.成员名(如 s1.number、s1.age)(2)结构数组元素成员的表示 结构数组名下标表达式.成员名 s25.name表示s2的第六个元素(结构变量)之name成员(3)结构指针成员的表示 结构指针-成员名(如 s3-sex)或(*结构指针).成员名(如(*s3).sex)对于多层嵌套结构成员,有多个“”,从外向内。,
11、结构成员的引用,2.成员运算符 两种成员运算符:“.”和“-”3.嵌套结构的结构成员的表示 结构成员本身又是结构变量,称为嵌套结构。必须使用若干个成员运算符来连接多个结构变量及其对应的分量,逐级表示到最低一级成员,该级成员是可以直接访问的基本数据对象。例如:student1.birthday表示student1中的birthday;而student1.birthday.year则表示student1中的birthday的year成员 注意:只能对最内层的成员进行存取、运算以及输入、输出等操作,结构成员的引用,4.结构变量成员的引用 结构变量的成员可以像普通变量一样进行各种运算,如赋值、输入、输
12、出、计算及地址操作等,例如:student1.birthday.year+;student.number=11001;scanf(“%d”,&student1.sex)将变量中的sex的地址作为参数传递给scanf函数,以输入sex的值,结构成员的引用,5、结构成员表示和引用的注意事项(1)如果成员是基本类型数据则可以直接引用;(2)在绝对多数场合(赋值运算除外),只能访问成员而不能直接访问结构本身。struct Student student1,student2 student1=student1+student1;printf(“%d,%s,%d,%cn“,student1);printf
13、(“%d,%s,%d,%c,%fn”,student1.number,student1.name,student1.age,student1.sex);Scanf(“%d,%s,%d,%c,%f”,printf(%o,student1);输出student1的首地址,(3)可以将一个结构变量作为一个整体赋给另一个具有相同类型的结构变量,其作用相当于逐个对位于赋值语句左部的结构变量的每个分量赋值。如:student2=student1;等效于:student2.number=student1.number;strcpy(student2.name,student1.name);student2.
14、sex=student1.sex;也可以把一个结构变量中的内嵌结构类型成员赋给另一个结构变量的对应得内嵌结构类型成员,例如 student2.birthday1=student1.birthday1;(4)不允许将一组常量直接赋给一个结构变量。如:student2=“lili”,18,M,12,15,1978,010001,89;,例8.3 试分析以下程序的执行结果:,#include struct Birthday int m;int d;int y;,void main()struct Student student1=1001,lili,18,M,12,15,1982,student2;
15、student2=student1;printf(student1:%ld%s%d%c%d/%d/%dn,student1.num,student1.name,student1.age,student1.sex,student1.birthday1.m,student1.birthday1.d,student1.birthday1.y);printf(student2:%ld%s%d%c%d/%d/%dn,student2.num,student2.name,student2.age,student2.sex,student2.birthday1.m,student2.birthday1.d,
16、student2.birthday1.y);,struct Student long num;char name10;int age;char sex;struct Birthday birthday1;,补充例 若有以下定义,则正确的赋值语句为()。struct date2 long i;char c;two;struct date1 int cat;struct date2 three;one;(A)one.three.c=A;(B)one.two.three.c=A;(C)three.c=A;(D)one.c=A;,8.2结构数组,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名
17、、成绩等数据)。如果有个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。,8.2.1结构数组的定义及其应用,1、结构数组的定义 结构数组是基类型为结构类型的数组。它既有结构变量的属性,又有数组的属性,这样对于成批的结构化数据,比如学生数据或职工数据,既便于表示和存储又便于采用循环语句实现重复处理。定义结构数组的语法格式:struct 标识符 数组名常量表达式;或 struct 标识符 成员表 数组名常量表达式;,结构数组的定义及其应用,后定义,struct child
18、 char initial;int age;int grade;struct child boy30;,同时定义,struct child char initial;int age;int grade;boy30;,直接定义,struct char initial;int age;int grade;boy30;,2、结构数组的初始化Struct Student student2=1101,”lilin”,1985,8,1,M,1102,”wangjing”,1985,7,1,F;Struct Student student=1101,”lilin”,1985,8,1,M,1102,”wang
19、jing”,1985,7,1,F;数组的下标说明会省略,Student0,Student1,结构数组的定义及其应用,8.2.2对结构数组的操作,1、引用结构数组元素 数组名下标表达式或*(数组名+i)如:employee2、*(employee+i)2、引用结构数组元素的成员 employee4.name employee4.salary注意:(1)可以像基本变量那样使用,如赋值、输出、计算等 scanf(“%s%c”,employee0.name,employee0=employee1,对结构数组的操作,struct child char initial;int age;int grade;
20、struct child boy2=a,5,3,b,4,2;,boy1.age+;,printf(“%d”,boy1.age),对结构数组的操作,例:struct student int num;char name20;char sex;int age;char addr30;a5;a0.num=060001;a1.name=Lin Hong;,一个结构体数组元素相当于一个结构体变量,其处理方法与结构体变量的处理方法相同,对结构数组的操作,例:struct student int num;char name20;char sex;int age;char addr30;a5;gets(a0.n
21、ame);scanf(%c,对结构数组的操作,3、结构数组应用实例例8.5计算学生的平均年龄,#include struct student int number;char name20;int age;stu4=1011,li li,21,1022,li hong,23,1023,wang ping,22,1024,zhang san,22;void main()int i=0;float ave,s=0;for(i=0;i4;i+)s+=stui.age;printf(s=%fn,s);ave=s/4;printf(average age=%fn,ave);,void main()stru
22、ct Device array=A,0,B,0,C,0;int i,j;char device_type;for(i=1;i=N;i+)scanf(%c,#include#define N 10/*设备数量*/struct Device char type;int count;,例8.6,8.3结构和指针,结构变量在内存中的起始地址称为结构变量的指针(简称结构指针)。我们可以声明一个指针变量,用来存放该地址,那么它就指向一个结构变量。引入结构指针的主要目的是实现结构变量的动态存储分配以及函数之间的双向数据传递。当然,结构变量的成员也可以使指针,甚至可以是指向相同类型结构变量的指针,这是构造链表
23、的基础。,8.3.1指向结构变量的指针,1.定义指向结构变量的指针struct 结构体名*结构体指针名;例 struct child*p;,存放结构体变量在内存的起始地址,struct child char initial;int age;int grade;boy;struct child*p=&boy,指向结构变量的指针,2.结构指针的初始化struct child char initial;int age;int grade;boy,*p1,*p2;p1=,3.通过指针来引用结构变量成员,指向运算符优先级:1结合方向:从左向右,例 int n;int*p=n=10,struct stud
24、ent stu1;struct student*p=(*p).num=101,(1)(*结构体指针).成员名 例如:(*p).num(2)结构体指针-成员名 例如:p-num,例8.7,#include#include struct Studentlong num;char name20;int age;char sex;void main()struct Student student,*p;p=,printf(nname:%snnumber:%ldnage:%dnsex:%cn,student.name,student.num,student.age,student.sex);printf
25、(nname:%snnumber:%ldnage:%dnsex:%cn,(*p).name,(*p).num,(*p).age,(*p).sex);printf(nname:%snnumber:%ldnage:%dnsex:%cn“,p-name,p-num,p-age,p-sex);,8.3.2指针变量作为结构成员,#include struct Studentint number;char*name;void main()struct Student stu=1101,lili;printf(%sn,stu.name);,指针变量作为结构成员,#include struct Student
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 用户 自定义 数据类型
链接地址:https://www.31ppt.com/p-5426356.html