C语言用户自定义数据类型.pptx
《C语言用户自定义数据类型.pptx》由会员分享,可在线阅读,更多相关《C语言用户自定义数据类型.pptx(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、18.1.1结构类型的定义一.结构类型的概念 前面的我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:当定义某一特定数据类型,就限定该类型变量的存储特性和取值范围。在日常生活中,我们常会遇到一些需要填写的登记表,如成绩表、通讯地址、员工信息等。其数据类型可能由性质不同的成员组成。第1页/共84页2结构类型的概念numbernameSexdepartmentagewage1wage29008806Li FangFInformatio188507809008807Lin HongFPersonnel1690076090088
2、08Wu QiangMTechnical189507909008809Li JunMPersonnel178807609008810Zhang Xia FTechnical17870795l上表中数据是由员工的工作证号(number)、姓名(name)、性别(sex)、年龄(age)、部门(department)、工资(wage)等数据项组成的,逻辑上相关的数据。l在C语言中,将这种由多个不同类型的数据项组合在一起形成的数据类型,称为结构体类型。第2页/共84页3 我们可以创建如下的结构类型:struct staff 其中staff由用户命名 char number8;char name10;
3、char sex;int age;char dep20;float wage2;以上定义了一个结构类型struct staff(与int 同地位),它包含了number、name、sex、age、dep、wage等不同类型的数据项。结构类型的概念第3页/共84页41结构体类型说明的一般形式 struct 标识符 结构成员列表;;说明:(1)struct是关键字,声明要定义一个结构类型,结构类型名用标示符命名,要“见名知义”;(2)成员列表给出n个成员声明,成员可以基本类型变量、数组,也可以是另一结构类型变量等,对每个成员必须作类型说明,成员之间用分号分隔;二.结构体类型及结构体变量第4页/共8
4、4页5l l学生的基本信息,学生的基本信息,包括包括学号、姓名、学号、姓名、性别、年龄、班级、性别、年龄、班级、成绩成绩等数据项。等数据项。l l这些数据项描述了这些数据项描述了一个学生的几个不一个学生的几个不同侧面。同侧面。nonamesexageclassnograde独立的变量:数据项之间无关联nonamesexageclassnograde数据项为一个整体数据项为一个整体struct student char no9;/学号 char name20;/姓名 char sex;/性别 unsigned int age;/年龄 unsigned int classno;/班级 float
5、grade;/成绩第5页/共84页62.结构类型的几点说明(1)对于结构类型,系统不会为之分配内存。只有在定义了结构变量后,系统才会分配内存单元给变量。(2)结构是由若干个数据项组成,每个数据项都属于一种已有定义的类型。每一个结构成员都不是独立的,它不是一般的变量,而是跟结构联系在一起。struct Student int number char name9;int age;char sex;int age;char sex;同名的age和sex均不会有命名冲突问题第6页/共84页7(3)结构类型可以嵌套定义。所谓嵌套定义是指在一个结构类型中可以包含另一个或一些结构类型,通常用于结构类型的成员
6、是一个结构变量的场合。namebirthdaysexmonthdayyear结构类型的几点说明第7页/共84页8结构类型的几点说明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;第8页/共84页9(4)允许省略结构类型名,即允许定义无类型名的结构类型。struct int year;int month;int day;birthday;无名的结构类型必须后随结构变
7、量(如birthday)的定义,并且仅能一处使用,这种形式通常用于内嵌在结构类型中的结构类型。(5)可以用sizeof运算符来计算结构类型的长度(字节数)例如:printf(“%d”,sizeof(struct Student);结果为18结构类型的几点说明第9页/共84页10 1.结构类型数据对象包括一般变量、指针、数组等,对于成为结构变量、结构指针、结构数组等可以在说明语句中用已定义的结构类型定义结构数据对象,也可以在定义结构类型的同时定义结构数据对象。8.1.2结构类型数据对象的定义及初始化struct date int month;int day;int year;struct sta
8、ff char number8;struct date birthday;char sex;定义了结构类型之后,还必须定义结构类型变量,类型与变量是不同的概念。第10页/共84页112结构类型变量的三种定义方式 (1)在说明结构类型的同时,也定义了结构类型变量例如:struct book int num;char name60;float price;book1,books3;在说明结构类型名struct book的同时,定义了结构类型变量book1与结构类型数组books,数组books有三个元素:books0、books1、books2。结构类型数据对象的定义及初始化第11页/共84页12
9、(2)先说明结构类型,再单独进行变量定义例如:struct staff char name10;char sex;float wage2;.struct staff worker1,worker2;(3)省略结构标识符,直接定义变量例如:struct /*此处没有标识符*/int month;char day;unsigned year;d5;没有标识符一定要在定义结构类型的同时定义变量。结构类型数据对象的定义及初始化第12页/共84页13 定义了结构类型:struce Student 后定义不同变量的区别:struce Student s1,s2100,*s3=&s1,*s4=s2;从上面可
10、以看出:(1)s1是该类型的变量,s2是该类型的一维数组,s3,s4 是指向该类型变量的结构指针;(2)结构类型的变量名不是地址.结构类型数据对象的定义及初始化第13页/共84页143.结构类型变量的初始化可以在定义结构类型变量的同时对其初始化,其语法格式:struct 标识符 结构变量名=成员初始化值表struct Student int number char name9;struct int year;int month;int day;birthday;char sex;student1=1101,”lilin”,1985,8,1,M;第14页/共84页15 定义了结构数据对象,就可以
11、访问其中的每一个成员。结构成员可以像基本变量那样使用,如赋值、输入输出、参加表达式的计算等,这些操作统称为对结构成员的访问。1、结构成员的表示 结构变量是由n个成员聚合而成的一个整体,要访问其中的一个成员,必须同时给出整体的名称和个体成员的名称。struct Student s1,s2100,*s3=&s1;s1是结构变量,用来存放单个学生的信息 s2是结构数组,该数组包含100个类型是struct Student 的成员,这样的数组可以表示一个学生情况 s3是结构指针,存放struct Student 类型数据对象s1的内存首地址。9.1.3结构成员的引用第15页/共84页16(1)结构变量
12、成员的表示:结构变量.成员名 (如 s1.number、s1.age)(2)结构数组元素成员的表示 结构数组名下标表达式.成员名 s25.name表示s2的第六个元素(结构变量)之name成员 (3)结构指针成员的表示 结构指针-成员名(如 s3-sex)或 (*结构指针).成员名(如(*s3).sex)对于多层嵌套结构成员,有多个“”,从外向内。结构成员的引用第16页/共84页172.成员运算符 两种成员运算符:“.”和“-”3.嵌套结构的结构成员的表示 结构成员本身又是结构变量,称为嵌套结构。必须使用若干个成员运算符来连接多个结构变量及其对应的分量,逐级表示到最低一级成员,该级成员是可以直
13、接访问的基本数据对象。例如:student1.birthday表示student1中的birthday;而student1.birthday.year则表示student1中的birthday的year成员 注意:只能对最内层的成员进行存取、运算以及输入、输出等操作结构成员的引用第17页/共84页184.结构变量成员的引用 结构变量的成员可以像普通变量一样进行各种运算,如赋值、输入、输出、计算及地址操作等,例如:student1.birthday.year+;student.number=11001;scanf(“%d”,&student1.sex)将变量中的sex的地址作为参数传递给scan
14、f函数,以输入sex的值结构成员的引用第18页/共84页195、结构成员表示和引用的注意事项(1)如果成员是基本类型数据则可以直接引用;(2)在绝对多数场合(赋值运算除外),只能访问成员而不能直接访问结构本身。struct Student student1,student2 student1=student1+student1;printf(“%d,%s,%d,%cn“,student1);printf(“%d,%s,%d,%c,%fn”,student1.number,student1.name,student1.age,student1.sex);Scanf(“%d,%s,%d,%c,%f
15、”,&student1);printf(%o,student1);输出student1的首地址第19页/共84页20(3)可以将一个结构变量作为一个整体赋给另一个具有相同类型的结构变量,其作用相当于逐个对位于赋值语句左部的结构变量的每个分量赋值。如:student2=student1;等效于:student2.number=student1.number;strcpy(student2.name,student1.name);student2.sex=student1.sex;也可以把一个结构变量中的内嵌结构类型成员赋给另一个结构变量的对应得内嵌结构类型成员,例如 student2.birth
16、day1=student1.birthday1;(4)不允许将一组常量直接赋给一个结构变量。如:student2=“lili”,18,M,12,15,1978,010001,89;第20页/共84页21例8.3 试分析以下程序的执行结果:#include struct Birthday int m;int d;int y;void main()struct Student student1=1001,lili,18,M,12,15,1982,student2;student2=student1;printf(student1:%ld%s%d%c%d/%d/%dn,student1.num,st
17、udent1.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,student2.birthday1.y);struct Student long num;char name10;int age;ch
18、ar sex;struct Birthday birthday1;第21页/共84页22补充例 若有以下定义,则正确的赋值语句为()。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;第22页/共84页238.2结构数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前
19、介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。第23页/共84页248.2.1结构数组的定义及其应用1、结构数组的定义 结构数组是基类型为结构类型的数组。它既有结构变量的属性,又有数组的属性,这样对于成批的结构化数据,比如学生数据或职工数据,既便于表示和存储又便于采用循环语句实现重复处理。定义结构数组的语法格式:struct 标识符 数组名常量表达式;或 struct 标识符 成员表 数组名常量表达式;第24页/共84页25结构数组的定义及其应用l后定义struct child char initial;int age;int grade
20、;struct child boy30;l同时定义struct child char initial;int age;int grade;boy30;l直接定义struct char initial;int age;int grade;boy30;第25页/共84页262、结构数组的初始化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,”wangjing”,1985,7,1,F;数组的下标说
21、明会省略Student0Student1结构数组的定义及其应用第26页/共84页278.2.2对结构数组的操作1、引用结构数组元素 数组名下标表达式或*(数组名+i)如:employee2、*(employee+i)2、引用结构数组元素的成员 employee4.name employee4.salary注意:(1)可以像基本变量那样使用,如赋值、输出、计算等 scanf(“%s%c”,employee0.name,&employee0.sex);(2)不能将结构数组元素作为一个整体进行输入或输出,但可以将结构数组元素作为一个整体进行赋值操作 printf(“%d”,employee0);sc
22、anf(“%d”,&employee0);employee0=employee1 第27页/共84页28对结构数组的操作struct child char initial;int age;int grade;struct child boy2=a,5,3,b,4,2;boy1.age+;printf(“%d”,boy1.age)第28页/共84页29对结构数组的操作例:struct student int num;char name20;char sex;int age;char addr30;a5;a0.num=060001;a1.name=Lin Hong;l一个结构体数组元素相当于一个结
23、构体变量,其处理方法与结构体变量的处理方法相同 第29页/共84页30对结构数组的操作例:struct student int num;char name20;char sex;int age;char addr30;a5;gets(a0.name);scanf(%c,&a0.sex);scanf(%d,&a0.age);a3=a0;printf(%s,&a3.name);第30页/共84页31对结构数组的操作3、结构数组应用实例例8.5计算学生的平均年龄#include struct student int number;char name20;int age;stu4=1011,li li
24、,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);第31页/共84页32void main()struct Device array=A,0,B,0,C,0;int i,j;char device_type;for(i=1;i=N;i+)scanf(%c,&device_type);for(j=0;j3;j+)if
25、(device_type=arrayj.type)arrayj.count+;for(i=0;i3;i+)printf(type=%c,count=%dn,arrayi.type,arrayi.count);#include#define N 10 /*设备数量*/struct Device char type;int count;例8.6第32页/共84页338.3结构和指针结构变量在内存中的起始地址称为结构变量的指针(简称结构指针)。我们可以声明一个指针变量,用来存放该地址,那么它就指向一个结构变量。引入结构指针的主要目的是实现结构变量的动态存储分配以及函数之间的双向数据传递。当然,结构变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 用户 自定义 数据类型
限制150内