




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言用户自定义数据类型1第第8章章 用户自定义数据类型用户自定义数据类型C语言用户自定义数据类型2本章内容本章内容n8.1 结构类型及其变量的定义结构类型及其变量的定义n8.2 结构数组结构数组n8.3 结构和指针结构和指针n8.4 联合类型联合类型n8.5 枚举类型枚举类型C语言用户自定义数据类型3一一. 结构类型的概念结构类型的概念 前面的我们学习了一些简单数据类型(整型、实前面的我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:当定二维)的定义和应用,这些数据类型的特
2、点是:当定义某一特定数据类型,就限定该类型变量的存储特性义某一特定数据类型,就限定该类型变量的存储特性和取值范围。和取值范围。 在日常生活中,我们常会遇到一些需要填写的登在日常生活中,我们常会遇到一些需要填写的登记表,如成绩表、通讯地址、员工信息等。其数据类记表,如成绩表、通讯地址、员工信息等。其数据类型可能由性质不同的成员组成。型可能由性质不同的成员组成。C语言用户自定义数据类型4结构类型的概念结构类型的概念numbernameSexdepartmentagewage1wage29008806Li FangFInformatio188507809008807Lin HongFPersonne
3、l169007609008808Wu QiangMTechnical189507909008809Li JunMPersonnel178807609008810Zhang Xia FTechnical17870795l上表中数据是由员工的工作证号上表中数据是由员工的工作证号(number)、姓名、姓名(name)、性别性别(sex) 、年龄、年龄(age) 、部门、部门( department) 、工资、工资(wage)等数据项组成的,逻辑上相关的数据。等数据项组成的,逻辑上相关的数据。l在在C语言中,将这种由多个不同类型的数据项组合在一起形成语言中,将这种由多个不同类型的数据项组合在一起形成
4、的数据类型,称为结构体类型。的数据类型,称为结构体类型。C语言用户自定义数据类型5 我们可以创建如下的结构类型:我们可以创建如下的结构类型: struct staff 其中其中staff由用户命名由用户命名 char number8; char name10; char sex; int age; char dep20; float wage2; ; 以上定义了一个结构类型以上定义了一个结构类型struct staff(与与int 同同地位地位),它包含了它包含了number、name、sex、age、dep、wage等不同类型的数据项。等不同类型的数据项。结构类型的概念结构类型的概念C语言用
5、户自定义数据类型61结构体类型说明的一般形式结构体类型说明的一般形式 struct 标识符标识符 结构成员列表;结构成员列表; ;说明:说明: (1) struct是关键字,声明要定义一个结构类型,结构类是关键字,声明要定义一个结构类型,结构类型名用标示符命名,要型名用标示符命名,要“见名知义见名知义”; (2)成员列表给出)成员列表给出n个成员声明,成员可以基本类型变量、个成员声明,成员可以基本类型变量、数组,也可以是另一结构类型变量等,对每个成员必须作数组,也可以是另一结构类型变量等,对每个成员必须作类型说明,成员之间用分号分隔;类型说明,成员之间用分号分隔;二二. 结构体类型及结构体变量
6、结构体类型及结构体变量C语言用户自定义数据类型7nonamesexageclassnograde独立的变量:独立的变量: 数据项数据项之间之间无关联无关联nonamesexageclassnogradestruct student char no9; /学号学号 char name20; /姓名姓名 char sex; /性别性别 unsigned int age; /年龄年龄 unsigned int classno; /班级班级 float grade;/成绩成绩C语言用户自定义数据类型8(1)对于结构类型,系统不会为之分配内存。只有在定义)对于结构类型,系统不会为之分配内存。只有在定义了
7、结构变量后,系统才会分配内存单元给变量。了结构变量后,系统才会分配内存单元给变量。(2)结构是由若干个数据项组成,每个数据项都属于一种)结构是由若干个数据项组成,每个数据项都属于一种已有定义的类型。每一个结构成员都不是独立的,它不是一已有定义的类型。每一个结构成员都不是独立的,它不是一般的变量,而是跟结构联系在一起。般的变量,而是跟结构联系在一起。struct Student int number char name9; int age; char sex; int age; char sex;同名的同名的age和和sex均均不会有命名冲突问不会有命名冲突问题题C语言用户自定义数据类型9(3)
8、结构类型可以嵌套定义。所谓嵌套定义是指在一结构类型可以嵌套定义。所谓嵌套定义是指在一个结构类型中可以包含另一个或一些结构类型,通个结构类型中可以包含另一个或一些结构类型,通常用于结构类型的成员是一个结构变量的场合。常用于结构类型的成员是一个结构变量的场合。namebirthdaysexmonthdayyear结构类型的几点说明结构类型的几点说明C语言用户自定义数据类型10结构类型的几点说明结构类型的几点说明struct Student char name9; struct Birthday int year; int month; int day; birthday; char sex;str
9、uct Student int number char name9; int age; char sex;C语言用户自定义数据类型11(4)允许省略结构类型名,即允许定义无类型名的结构类)允许省略结构类型名,即允许定义无类型名的结构类型。型。struct int year; int month; int day; birthday; 无名的结构类型无名的结构类型必 须 后 随 结 构 变 量必 须 后 随 结 构 变 量(如(如birthday)的定义,的定义,并且仅能一处使用,并且仅能一处使用,这种形式通常用于内这种形式通常用于内嵌在结构类型中的结嵌在结构类型中的结构类型。构类型。(5)可以
10、用)可以用sizeof运算符来计算结构类型的长度(字节数)运算符来计算结构类型的长度(字节数)例如:例如:printf(“%d”,sizeof(struct Student); 结果为结果为18结构类型的几点说明结构类型的几点说明C语言用户自定义数据类型12 1.结构类型数据对象包括一般变量、指针、数组等,对结构类型数据对象包括一般变量、指针、数组等,对于成为结构变量、结构指针、结构数组等可以在说明语句中于成为结构变量、结构指针、结构数组等可以在说明语句中用已定义的结构类型定义结构数据对象,也可以在定义结构用已定义的结构类型定义结构数据对象,也可以在定义结构类型的同时定义结构数据对象。类型的同
11、时定义结构数据对象。struct date int month; int day; int year; ;struct staff char number8; struct date birthday; char sex; ; 定义了结构类型之后定义了结构类型之后, 还必须定义结构类型变量还必须定义结构类型变量, 类型与变量类型与变量是不同的概念。是不同的概念。C语言用户自定义数据类型132结构类型变量的三种定义方式结构类型变量的三种定义方式 (1) 在说明结构类型的同时在说明结构类型的同时, 也定义了结构类型变量也定义了结构类型变量例如:例如: struct book int num; ch
12、ar name60; float price; book1, books3;n在说明结构类型名在说明结构类型名struct book的同时的同时,定义了结构类型变定义了结构类型变量量book1与结构类型数组与结构类型数组books, 数组数组books有三个元素:有三个元素:books0、books1、books2。结构类型数据对象的定义及初始化结构类型数据对象的定义及初始化C语言用户自定义数据类型14(2) 先说明结构类型先说明结构类型, 再单独进再单独进行变量定义行变量定义例如:例如:struct staff char name10; char sex; float wage2; ; .s
13、truct staff worker1, worker2;(3) 省略结构标识符省略结构标识符, 直接定义直接定义变量变量例如:例如:struct /* 此处没有标识符此处没有标识符*/ int month; char day; unsigned year; d5; 没有标识符一定要在定义没有标识符一定要在定义结构类型的同时定义变量。结构类型的同时定义变量。结构类型数据对象的定义及初始化结构类型数据对象的定义及初始化C语言用户自定义数据类型15 定义了结构类型定义了结构类型: struce Student 后定义不同变量的区后定义不同变量的区别别:struce Student s1, s210
14、0, * *s3=&s1, * *s4=s2; 从上面可以看出从上面可以看出: (1) s1是该类型的变量是该类型的变量, s2是该类型的一维数组是该类型的一维数组, s3, s4 是指向该类型变量的结构指针是指向该类型变量的结构指针; (2) 结构类型的变量名不是地址结构类型的变量名不是地址. 结构类型数据对象的定义及初始化结构类型数据对象的定义及初始化C语言用户自定义数据类型163. 结构类型变量的初始化结构类型变量的初始化可以在定义结构类型变量的同时对其初始化,其语法可以在定义结构类型变量的同时对其初始化,其语法格式:格式:struct 标识符标识符 结构变量名结构变量名=成员初始化值表
15、成员初始化值表struct Student int number char name9; struct int year; int month; int day; birthday; char sex;student1=1101,”lilin”,1985,8,1,M;C语言用户自定义数据类型17 定义了结构数据对象,就可以访问其中的每一个成员。定义了结构数据对象,就可以访问其中的每一个成员。结构成员可以像基本变量那样使用,如赋值、输入输出、参结构成员可以像基本变量那样使用,如赋值、输入输出、参加表达式的计算等,这些操作统称为对结构成员的访问。加表达式的计算等,这些操作统称为对结构成员的访问。1
16、、结构成员的表示、结构成员的表示 结构变量是由结构变量是由n个成员聚合而成的一个整体,要访问其个成员聚合而成的一个整体,要访问其中的一个成员,必须同时给出整体的名称和个体成员的名称。中的一个成员,必须同时给出整体的名称和个体成员的名称。 struct Student s1,s2100,* *s3=&s1; s1是结构变量,用来存放单个学生的信息是结构变量,用来存放单个学生的信息 s2是结构数组,该数组包含是结构数组,该数组包含100个类型是个类型是struct Student 的成员,这样的数组可以表示一个学生情况的成员,这样的数组可以表示一个学生情况 s3是结构指针,存放是结构指针,存放st
17、ruct Student 类型数据对象类型数据对象s1的内存首地址。的内存首地址。C语言用户自定义数据类型18(1)结构变量成员的表示)结构变量成员的表示: 结构变量结构变量 . 成员名成员名 (如如 s1.number、s1.age)(2)结构数组元素成员的表示)结构数组元素成员的表示 结构数组名结构数组名下标表达式下标表达式.成员名成员名 表示表示s2的第六个元素(结构变量)之的第六个元素(结构变量)之name成员成员 (3)结构指针成员的表示)结构指针成员的表示 结构指针结构指针-成员名成员名 (如如 s3-sex) 或或 (* *结构指针结构指针). 成员名成员名 (如
18、如 (* *s3).sex) 对于多层嵌套结构成员对于多层嵌套结构成员, 有多个有多个“”,从外向内。,从外向内。结构成员的引用结构成员的引用C语言用户自定义数据类型192. 成员运算符成员运算符 两种成员运算符:两种成员运算符:“.”和和“-” 结构成员本身又是结构变量,称为嵌套结构。必须使用若结构成员本身又是结构变量,称为嵌套结构。必须使用若干个成员运算符来连接多个结构变量及其对应的分量,逐级干个成员运算符来连接多个结构变量及其对应的分量,逐级表示到最低一级成员,该级成员是可以直接访问的基本数据表示到最低一级成员,该级成员是可以直接访问的基本数据对象。对象。 注意:只能对最内层的成员进行存
19、取、运算以及输入、输注意:只能对最内层的成员进行存取、运算以及输入、输出等操作出等操作结构成员的引用结构成员的引用C语言用户自定义数据类型20 结构变量的成员可以像普通变量一样进行各种运算,如赋结构变量的成员可以像普通变量一样进行各种运算,如赋值、输入、输出、计算及地址操作等,例如:值、输入、输出、计算及地址操作等,例如: student1.birthday.year+; student.number=11001; scanf(“%d) 将变量中的将变量中的sex的地址作为参数传递给的地址作为参数传递给scanf函数,以输函数,以输入入sex的值的值结构成员的引用结构成员的引用C语言用户自定义
20、数据类型215、结构成员表示和引用的注意事项、结构成员表示和引用的注意事项(1)如果成员是基本类型数据则可以直接引用;)如果成员是基本类型数据则可以直接引用; (2)在绝对多数场合(赋值运算除外),只能访问成员而)在绝对多数场合(赋值运算除外),只能访问成员而不能直接访问结构本身。不能直接访问结构本身。 struct Student student1,student2 student1=student1+student1; printf(“%d,%s,%d,%cn“,student1); printf(“%d,%s,%d,%c,%fn”,student1.number,student1.nam
21、e,student1.age,student1.sex);Scanf(“%d,%s,%d,%c,%f”,&student1);printf(%o,student1);输出);输出student1的首地址的首地址C语言用户自定义数据类型22(3)可以将一个结构变量作为一个整体赋给另一个具有相同)可以将一个结构变量作为一个整体赋给另一个具有相同类型的结构变量,其作用相当于逐个对位于赋值语句左部类型的结构变量,其作用相当于逐个对位于赋值语句左部的结构变量的每个分量赋值。如:的结构变量的每个分量赋值。如: student2=student1; 等效于:等效于: student2.number=stud
22、ent1.number; strcpy(,); student2.sex=student1.sex; 也可以把一个结构变量中的内嵌结构类型成员赋给另一个也可以把一个结构变量中的内嵌结构类型成员赋给另一个结构变量的对应得内嵌结构类型成员,例如结构变量的对应得内嵌结构类型成员,例如 student2.birthday1=student1.birthday1;(4)不允许将一组常量直接赋给一个结构变量。如:)不允许将一组常量直接赋给一个结构变量。如: student2=“lili”,18,M,12,15,1978,010001,89; C语言用户自
23、定义数据类型23例例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,, student1.age,student1.sex,student1.birthday1.m,student1.bi
24、rthday1.d, student1.birthday1.y);printf(student2:%ld %s %d %c %d/%d/%dn,student2.num,, student2.age,student2.sex,student2.birthday1.m,student2.birthday1.d, student2.birthday1.y); struct Student long num; char name10; int age; char sex; struct Birthday birthday1;C语言用户自定义数据类型24补充例补充例 若有以下
25、定义,则正确的赋值语句为若有以下定义,则正确的赋值语句为( )。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;C语言用户自定义数据类型25 一个结构体变量中可以存放一组数据(如一个一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有个学生的学号、姓名、成绩等数据)。如果有个学生的数据需要参加运算,显然应该用数组,这就学生的数据
26、需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。型的数据,它们都分别包括各个成员(分量)项。 C语言用户自定义数据类型261、结构数组的定义、结构数组的定义 结构数组是基类型为结构类型的数组。它既有结构变量结构数组是基类型为结构类型的数组。它既有结构变量的属性,又有数组的属性,这样对于成批的结构化数据,比的属性,又有数组的属性,这样对于成批的结构化数据,比如学生数据或职工数据,既便于表示和存
27、储又便于采用循环如学生数据或职工数据,既便于表示和存储又便于采用循环语句实现重复处理。语句实现重复处理。 定义结构数组的语法格式:定义结构数组的语法格式: struct 标识符标识符 数组名数组名常量表达式常量表达式;或或 struct 标识符标识符 成员表成员表 数组名数组名常量表达式常量表达式; C语言用户自定义数据类型27结构数组的定义及其应用结构数组的定义及其应用l后定义后定义struct child char initial;int age;int grade; struct child boy30;l同时定义同时定义struct child char initial;int age
28、;int grade; boy30;l直接定义直接定义struct char initial;int age;int grade; boy30;C语言用户自定义数据类型282、结构数组的初始化、结构数组的初始化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;数组的下标说明会省略数组的下标说明会省略Student0Student1结构数组的定义
29、及其应用结构数组的定义及其应用C语言用户自定义数据类型291、引用结构数组元素、引用结构数组元素 数组名数组名下标表达式下标表达式或或* *(数组名数组名+i) 如:如:employee2、* *(employee+i)2、引用结构数组元素的成员、引用结构数组元素的成员 employee4.salary注意:注意:(1)可以像基本变量那样使用,如赋值、输出、计算等)可以像基本变量那样使用,如赋值、输出、计算等 scanf(“%s%c”, , &employee0.sex); (2)不能将结构数组元素作为一个整体进行输入或输出,但可)不能
30、将结构数组元素作为一个整体进行输入或输出,但可以将结构数组元素作为一个整体进行赋值操作以将结构数组元素作为一个整体进行赋值操作 printf(“%d”,employee0);scanf(“%d”,&employee0); employee0=employee1 C语言用户自定义数据类型30对结构数组的操作对结构数组的操作struct child char initial;int age;int grade; ;struct child boy2=a,5,3,b,4,2;boy1.age+;printf(“%d”,boy1.age)C语言用户自定义数据类型31对结构数组的操作对结构数组的操作例:
31、例:struct student int num; char name20; char sex; int age; char addr30; a5; a0. num=060001;a1. name=Lin Hong;l一个结构体数组元素一个结构体数组元素相当于一个结构体变量,相当于一个结构体变量,其处理方法与结构体变其处理方法与结构体变量的处理方法相同量的处理方法相同 C语言用户自定义数据类型32对结构数组的操作对结构数组的操作例:例:struct student int num; char name20; char sex; int age; char addr30; a5; gets(a0
32、.name);scanf(%c,&a0.sex);scanf(%d,&a0.age);a3 = a0 ;printf(%s,&);C语言用户自定义数据类型33对结构数组的操作对结构数组的操作3、结构数组应用实例、结构数组应用实例计算学生的平均年龄计算学生的平均年龄#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
33、,s=0; for(i=0;i4;i+) s+=stui.age; printf(s=%fn,s); ave=s/4; printf(average age=%fn,ave);C语言用户自定义数据类型34void 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(device_type=arrayj.type) arrayj.count+; for(i=0; i3; i+) p
34、rintf(type=%c,count=%dn, arrayi.type, arrayi.count);#include #define N 10 /*设备数量设备数量*/struct Device char type; int count;C语言用户自定义数据类型35n结构变量在内存中的起始地址称为结构变量的指结构变量在内存中的起始地址称为结构变量的指针(简称结构指针)。针(简称结构指针)。n我们可以声明一个指针变量,用来存放该地址,我们可以声明一个指针变量,用来存放该地址,那么它就指向一个结构变量。那么它就指向一个结构变量。n引入结构指针的主要目的是实现结构变量的动态引入结构指针的主要目的
35、是实现结构变量的动态存储分配以及函数之间的双向数据传递。存储分配以及函数之间的双向数据传递。n当然,结构变量的成员也可以使指针,甚至可以当然,结构变量的成员也可以使指针,甚至可以是指向相同类型结构变量的指针,这是构造链表是指向相同类型结构变量的指针,这是构造链表的基础。的基础。C语言用户自定义数据类型36struct 结构体名结构体名 *结构体指针名结构体指针名;例例 struct child *p;存放结构体变量在存放结构体变量在内存的起始地址内存的起始地址struct child char initial;int age;int grade;boy ;struct child *p=&bo
36、yinitialagegradeboypC语言用户自定义数据类型37指向结构变量的指针指向结构变量的指针2. 结构指针的初始化结构指针的初始化struct child char initial;int age;int grade;boy, *p1, *p2;p1 = &boy;p2 = NULL;struct child *p = &boy;C语言用户自定义数据类型38指向运算符指向运算符优先级优先级: 1结合方向:从左向右结合方向:从左向右例例 int n; int *p=&n; *p=10; n=10struct student stu1;struct student *p=&stu1;=
37、101; (*p).num=101(1)(*结构体指针结构体指针).成员名成员名 例如:例如:(* p).num(2)结构体指针)结构体指针-成员名成员名 例如:例如:p- numC语言用户自定义数据类型39#include #include struct Studentlong num; char name20; int age; char sex;void main() struct Student student,*p; p=&student; strcpy(,wang li); student.num=89101; student.age=18; student
38、.sex=M; printf(nname:%snnumber:%ldnage:%dnsex:%cn,,student.num, student.age,student.sex); printf(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);C语言用户自定义数据类型40#include struct Studentint number
39、; char *name; ;void main() struct Student stu=1101,lili;printf(%sn,);C语言用户自定义数据类型41指针变量作为结构成员指针变量作为结构成员#include struct Studentint number; char *name; ;void main() struct Student stu; scanf(%d,&stu.number); =(char *)calloc(21,sizeof(char); scanf(%s,); printf(%sn,stu.number);pr
40、intf(%sn,); 指针变量如果没有初始化,指针变量如果没有初始化,它的指向是不确定的,也即不它的指向是不确定的,也即不可用。必须调用可用。必须调用calloc函数为函数为其申请内存空间其申请内存空间C语言用户自定义数据类型42指针变量作为结构成员指针变量作为结构成员1. 指针类型的成员变量要赋值时需分配内存空间指针类型的成员变量要赋值时需分配内存空间2.如果变量的空间分配通过内存分配函数完成,最后还要释如果变量的空间分配通过内存分配函数完成,最后还要释放这块内存区域。放这块内存区域。l介绍三个存储管理库函数,原型说明在介绍三个存储管理库函数,原型说明在 “”“”头文件中,
41、使头文件中,使用包含到源程序中用包含到源程序中 动态分配存储区函数动态分配存储区函数malloc( ) 函数原型:函数原型:void *malloc(unsigned size); 调用格式:调用格式:malloc(size) 功能:在内存分配一个功能:在内存分配一个size字节的存储区。调用字节的存储区。调用 结果为新分配的存储区的首地址,是一个结果为新分配的存储区的首地址,是一个void 类型指针。若分配失败,则返回类型指针。若分配失败,则返回NULL(即(即0)。)。C语言用户自定义数据类型43指针变量作为结构成员指针变量作为结构成员 动态分配存储区函数动态分配存储区函数calloc(
42、) 函数原型:函数原型: void *calloc(unsigned int n,unsigned int size); 调用格式:调用格式:calloc(n,size) 功能:在内存分配一个功能:在内存分配一个n倍倍size字节的存储区。字节的存储区。调用结果为新分配的存储区的首地址,是一个调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回类型指针。若分配失败,则返回NULL(即(即0)。)。C语言用户自定义数据类型44指针变量作为结构成员指针变量作为结构成员 释放动态分配存储区函数释放动态分配存储区函数free( ) 函数原型:函数原型:void free(voi
43、d *p); 实参必须是一个指向动态分配存储区实参必须是一个指向动态分配存储区的指针,它可以是任何类型的指针变量。的指针,它可以是任何类型的指针变量。调用格式:调用格式:free(p)功能:释放功能:释放p所指向的动态分配的存储区。所指向的动态分配的存储区。C语言用户自定义数据类型45 可以定义一个结构指可以定义一个结构指针指向一个结构数组,也就针指向一个结构数组,也就可以利用该指针间接访问结可以利用该指针间接访问结构数组的元素。构数组的元素。Struct A int a; float b; arr3,*p;p=arr;11.52.523.53arr0arr1arr2parr11.52.523
44、.53arr0arr1arr2parrC语言用户自定义数据类型46指向结构数组的指针指向结构数组的指针(1)p-a; 得到得到p指向的结构数组元素中的成员指向的结构数组元素中的成员a的值的值(2)( p+)-a; 先得到先得到p指向的结构数组元素中的成员指向的结构数组元素中的成员a的值,然后再对的值,然后再对p指针加指针加1(3)(+ p)-a; 先让先让p指针加指针加1,然后得到,然后得到p指向的结构数组元素中的成员指向的结构数组元素中的成员a的值的值(4)( p-a)+;先得到先得到p指向的结构数组元素中的成员指向的结构数组元素中的成员a的值,然后再对得到的值,然后再对得到的值加的值加1C
45、语言用户自定义数据类型47#include struct Studentint num; char name20; char sex; int age; ; struct Student stu2=10101,li lin,M,18,10102,zhang fan,M,19;void main() struct Student *p; clrscr(); printf(No. name sex agen); for(p=stu;pnum,p-name, p-sex,p-age);C语言用户自定义数据类型481结构体变量作为函数的形参的三种形式:结构体变量作为函数的形参的三种形式:(1)以结构体
46、变量的成员作为参数,传递结构体)以结构体变量的成员作为参数,传递结构体变量的成员的值。变量的成员的值。(2)以结构体变量作为参数,直接传递结构体变)以结构体变量作为参数,直接传递结构体变量的值。量的值。 结构变量整体传送,即将实参结构体变量的各结构变量整体传送,即将实参结构体变量的各个成员的值逐个传递给形参结构体变量的对应成个成员的值逐个传递给形参结构体变量的对应成员。员。 注意,实参与形参必须是相同结构体类型的变注意,实参与形参必须是相同结构体类型的变量。量。(3)以结构体指针作为参数,传递结构体变量的)以结构体指针作为参数,传递结构体变量的地址。地址。C语言用户自定义数据类型49例例8.1
47、0:输出学生的姓名与年龄:输出学生的姓名与年龄struct Student int num; char name20; int age; void age(struct Student *p) printf(%sn,p-name); printf(%dn, p-age);void main() struct Student stu3 = 101, kiki,23, 102, mimi,24, 103, nana, 23 ; struct Student *p; p = &stu0; age(p+1);C语言用户自定义数据类型50例例: 计算三个学生的总分和平均分计算三个学生的总分和平均分(利用
48、结构指针利用结构指针)。main() struct stu char name10; float score; stu3=Mary, 76, John, 85, Tom, 81, *p=stu; int i; float sum=0; for (i=1; iscore; p+; printf(%5.2f, %5.2f n, sum, sum/3); getch();C语言用户自定义数据类型51结构类型的应用结构类型的应用例:定义一个包括年、月、日成员的结构类型变量,输入例:定义一个包括年、月、日成员的结构类型变量,输入一个符合常规的日期,算出该日期是这一年中的第几一个符合常规的日期,算出该日期
49、是这一年中的第几天并输出。天并输出。【分析】这里主要存在一个闰年问题,也就是当该年为闰【分析】这里主要存在一个闰年问题,也就是当该年为闰年时,二月份有年时,二月份有29天,其余为天,其余为28天。判断该年是否为天。判断该年是否为闰年的条件是:年份是否能被闰年的条件是:年份是否能被4整除,但不能整除,但不能100整除;整除;或能被或能被400整除;当然还要判断输入的日期是否有效整除;当然还要判断输入的日期是否有效以及各月的天数情况。以及各月的天数情况。C语言用户自定义数据类型52结构类型的应用结构类型的应用main() struct unsigned year, month, day; x; i
50、nt maxday=0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; int i, n=0; /* n为天数为天数 */ do printf(请输入年请输入年 月月 日日:); scanf(%d%d%d, &x.year, &x.month, &x.day); if (x.year%4=0 & x.year%100!=0) | (x.year%400=0) maxday2=29; while (x.year0|x.month12|x.daymaxdayx.month); for (i=1; iage (B) (*+p). age (C) (*
51、p+). age (D) *(+p)- age C语言用户自定义数据类型54课课 堂堂 练练 习习3若定义如下结构,则能打印出字母若定义如下结构,则能打印出字母M的语句是(的语句是( )。)。struct person char name9; int age;struct person class10=Wujun, 20, Liudan, 23, Maling, 21, zhangming, 22; (A) printf(%cn, ); (B) printf(%cn, 0); (C) printf(%cn, 1); (D) pr
52、intf(%cn, 1);C语言用户自定义数据类型551联合类型的概念:联合类型的概念: 将若干个变量组织在一起,使它们能将若干个变量组织在一起,使它们能在不同的时间占用同一段内存空间,这种数据组合对应得数在不同的时间占用同一段内存空间,这种数据组合对应得数据类型称为联合类型或共同体类型。据类型称为联合类型或共同体类型。 union 联合类型名联合类型名 (union是是C语言关键字语言关键字) 成员列表成员列表; ;C语言用户自定义数据类型56例如:例如: union abc (union是是C语言关键字语言关键字) char ch; int i; float f; v
53、; 以上说明了一个联合类型以上说明了一个联合类型: union abc, 同时定义一个同时定义一个联合类型变量联合类型变量v。 内存高地址内存高地址 内存低地址内存低地址符变量符变量ch 占占1字节字节 整型变量整型变量 i 占占2字节字节单精度实型变量单精度实型变量f占占4字节字节 联合的概念及联合类型定义联合的概念及联合类型定义C语言用户自定义数据类型57union 联合体类型名联合体类型名 数据类型名数据类型名1 成员名成员名1; 数据类型名数据类型名2 成员名成员名2; ;类型定义不分配内存类型定义不分配内存p 联合体的大小联合体的大小是成员中占内存最是成员中占内存最大的成员的大小大的
54、成员的大小共占共占4字节字节最新存储的数据是有效的联合的概念及联合类型定义联合的概念及联合类型定义C语言用户自定义数据类型58说明:说明:(1) 系统为所有联合类型成员分配同一地址开始的存储空间系统为所有联合类型成员分配同一地址开始的存储空间, 使用覆盖的方式共享存储单元。使用覆盖的方式共享存储单元。例:用数组作联合类型的成员例:用数组作联合类型的成员union utp1 unsigned char b2; unsigned w; r1; 本例联合类型中本例联合类型中, 定定, 用用r1.b1。例如下列程序段:。例如下列程序段:r1.w = 0 x6141; printf(%c, %c, %u
55、n, r1.b0, r1.b1, r1.w); 输出结果是:输出结果是:A, a, 24897w4161b1b0联合的概念及联合类型定义联合的概念及联合类型定义C语言用户自定义数据类型59(2) 联合类型也允许嵌套定义联合类型也允许嵌套定义,例如:例如:union utp struct char low, high; b; unsigned w; r ; 以上在联合类型中以上在联合类型中, 定义了一个结构类型成员定义了一个结构类型成员b, 如如上图所示。本例中可以用上图所示。本例中可以用,而用值而用值, 也可以用也可以用r.w一次存取一次存取双字节的值。双字节的值。wb.lowb.high联合
56、的概念及联合类型定义联合的概念及联合类型定义C语言用户自定义数据类型60(3) 联合类型变量所占空间的大小取决于占存储空间最大的联合类型变量所占空间的大小取决于占存储空间最大的那个成员。例如上述例子中那个成员。例如上述例子中(图图4.13所示所示), sizeof(u_type)或或sizeof(v)的值均为的值均为, 因为成员因为成员ch、i、f中中, f占个字节的存储空间占个字节的存储空间, 是占空间最大的。是占空间最大的。(4) 由于联合类型变量中所有成员共享存储空间由于联合类型变量中所有成员共享存储空间, 因此变量因此变量中的所有成员的首地址相同中的所有成员的首地址相同, 而且联合类型
57、变量的地址而且联合类型变量的地址也就是该变量成员的地址。也就是该变量成员的地址。&r, &r.w, &r.b.low的值均相的值均相同。同。联合的概念及联合类型定义联合的概念及联合类型定义C语言用户自定义数据类型61练习:如果有定义:练习:如果有定义:union xy char ch; int a3; float b;);共用体类型共用体类型union xy的存储单元中各成员占用空间情况如的存储单元中各成员占用空间情况如图:图: 则共用体类型则共用体类型union xy的长度是的长度是6(占用内存的字节数)。(占用内存的字节数)。cha0a1a2b联合的概念及联合类型定义联合的概念及联合类型定
58、义C语言用户自定义数据类型62共用体变量的定义有如下三种处理方式:共用体变量的定义有如下三种处理方式:(1)先定义共用体类型,再定义共用体变量。)先定义共用体类型,再定义共用体变量。例例1:union xy char ch; int a3; float b; /*定义共用体类型定义共用体类型union xy */union xy x,y; /*定义定义x、y为共用体类型为共用体类型union xy的变量的变量*/C语言用户自定义数据类型63联合变量的定义及成员的引用联合变量的定义及成员的引用(2)在定义共用体类型的同时定义共用体变量。)在定义共用体类型的同时定义共用体变量。例例2:union
59、xy char ch; int a3; float b; x,y; (3)直接定义共用类型变量。)直接定义共用类型变量。例例3:union char ch; int a3; float b; x,y; C语言用户自定义数据类型64l联合体与结构体都是由多个成员分量组成的一个联合体与结构体都是由多个成员分量组成的一个整体;整体;l联合体与结构体在定义、说明和使用(成员引用、联合体与结构体在定义、说明和使用(成员引用、指针)上十分相似。指针)上十分相似。n结构体:多个成员分量分别占用不同的存储空间结构体:多个成员分量分别占用不同的存储空间构成一个整体;成员分量之间是相互独立的,所构成一个整体;成员
60、分量之间是相互独立的,所进行的各种操作互不影响。进行的各种操作互不影响。:多个成员分量共同:多个成员分量共同存储空间;存储空间;成员成员之间是之间是的,所进行的操作相互的,所进行的操作相互依赖。依赖。C语言用户自定义数据类型65:联合在一个时间里不能三个成员同时起作:联合在一个时间里不能三个成员同时起作用,而只能有一个成员在起作用,而且是最后被用,而只能有一个成员在起作用,而且是最后被赋值的成员;而结构在任何一个时间都是三个成赋值的成员;而结构在任何一个时间都是三个成员同时在起作用。员同时在起作用。n联合变量的长度等于类型最长的成员的长度,而联合变量的长度等于类型最长的成员的长度,而结果变量的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 道路安全培训教材课件
- 2025年全国特种作业操作证高处安装、维护、拆除真题及答案
- 2025年传染病防控医学考试试题及答案
- 桥体广告施工方案
- 电商直播内容监管政策与合规运营指南
- 图形面积的比较课件
- 道路保洁岗前安全培训课件
- 电商平台食品饮料运营案例研究与2025年爆款孵化策略全析
- 融媒体工程实施方案范文(3篇)
- 建筑工程造价实习方案(3篇)
- 事业单位考试职业能力倾向测验(自然科学专技类C类)试卷及解答参考(2025年)
- 人教统编版(部编版)小学科学教材目录
- 6.4.3.1余弦定理教学设计高一下学期数学人教A版
- 颈椎后路单开门椎管扩大成形术的护理课件
- 新外研版(三起)三年级上册英语全册教学课件(2024年新版教材)
- 外研版七年级上册初一英语全册课时练(一课一练)
- 蚯蚓养殖和治污改土技术规程 第1部分:蚯蚓养殖和粪污处理
- 成人鼻肠管的留置与维护(2021团体标准解读)-20221004172843
- 借款利息确认书
- 熟识邮轮客舱房态讲解
- 汉字五行属性查询表
评论
0/150
提交评论