版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,8.1结构体类型的定义,8.2结构体类型变量的定义和引用,8.3结构体类型数组,8.4指向结构体类型数据的指针,第八章 结构体和共用体,8.5共用体类型,8.6枚举类型,8.7用户自定义类型,2,结构体类型的定义,C语言的数据类型中有一种类型是“构造类型”,它是由若 干个类型相同或不同的数据组合而成的,前面已经介绍过的 数组就是一种构造类型,但是它只有存放数据类型相同的若 干个数据,如果出现数据类型不同的若干个数据,用单个数 组就无法将它们存放在一起,为了整体存放这些类型不同的相关数据,C语言提供了另一种构造类型:结构体类型,它可以将若干个不同类型的数据存放在一起。,返回,3,一、结构体类
2、型数据的特点,构造类型是由相同或不同的数据类型组合而成。C语言规定用户可以自己定义一种数据类型来存放类型不同的数据。这种数据类型就称为“结构体类型”。 例如,一个人的有关信息就是由不同数据类型的数据组合而成的,姓名是字符串型(用字符数组来存放),性别是字符型(用m表示男性,用f表示女性),年龄是整型,工资是实型,等等。这样就可以定义含有一个字符数组、一个字符型、一个整型、一个实型的数据为一个结构体类型数据。,4,又如一个学生的下列信息也可以定义为另一种结构体类型数据: 学号 姓名 性别 年龄 成绩1 成绩2 成绩3 长整型 字符型 字符 整型 实型 实型 实型,这种结构体类型中可以定义成包含一
3、个长整型、一个字符数组、一个字符型、一个整型、三个实型的结构体类型;也可以将其中的三个实型定义为一个实型数组。,5,二、结构体类型的定义,格式: struct 结构体类型名 数据类型1 成员1名; 数据类型2 成员2名; . . . 数据类型n 成员n名; ;,注意:结构体定义语句的右花括号后面用“分号(;)”做语句结束标记。,6,结构体类型名是用户取的标识符; 数据类型可以是基本类型说明符,也可以是已定义过的 结构体类型名,还可以是后面要介绍的其他数据类型说明符, 如共用体类型等。 成员名是用户取的标识符,用来标识所包含的成员名称。 成员也称“域”、“结构分量”。,例如,为了存放一个人的姓名
4、、性别、年龄、工资, 可以定义如下的结构体类型: struct person char name20; char sex; int age; float wage; ;,7,又如,为了存放一个学生的学号、姓名、性别、年龄、 成绩1、成绩2、成绩3,可以定义如下的结构体类型: struct student long number; char name20; char sex; int age; float score3; ;,结构体类型的定义是可以嵌套的,即某个结构体类型成员的数据类型可以说明为另一个已定义的结构类型。 例如:,8,struct birthday int year; int mo
5、nth; int day; ; struct person1 char name20; char sex; struct birthday bir; float wage; ;,返回,9,结构体类型变量的定义和引用,一、结构体类型变量的定义和初始化,1、先定义结构体,后定义变量 例如,为学生信息定义2个变量,程序段如下: struct student long number; char name20; char sex; float score3; ; . . . struct student x,y;,10,在定义变量的同时,可以对变量赋初值,例如上例中的 定义语句可以改写如下: struc
6、t student x=100001L,zhao1,f,89,94,86, y=100002L,zhao2,m,78,86,92; 这个定义语句将使得变量x和y的各个成员获得如下的初值: number name sex score0 score1 score2 变量x 100001L zhao1 f 89 94 86 变量y 100002L zhao2 m 78 86 92,11,例如,为学生信息定义2个变量x和y,并给它们赋初值, 程序段如下: struct student long number; char name20; char sex; float score3; x=100001L
7、,zhao1,f,89,94,86, y=100002L,zhao2,m,78,86,92;,2、定义结构体类型的同时定义变量,12,3、定义无名称的结构体类型的同时定义变量 例如,为学生信息定义2个变量x和y,并给它们赋初值, 程序段如下: struct long number; char name20; char sex; float score3; x=100001L,zhao1,f,89,94,86, y=100002L,zhao2,m,78,86,92;,13,二、结构体类型变量成员的引用,结构体类型变量成员的引用格式如下: 结构体类型变量名. 成员名 其中的“”称为成员运算符,其运
8、算级别是最高的,和圆 括号运算符“( )”、下标运算符“”是同级别的,运算顺序是自 左向右的。 如果某个结构体类型变量的成员数据类型又是一个结构体类型,则其成员的引用方法如下: 外层结构体类型变量.外层成员名.内层成员名,1、结构体类型变量成员的引用方法,14,例1 :我们以如下的学生信息结构体类型为例,给出其变量成员的引用方式。 程序清单如下: #include string.h struct student long number; char name20; char sex; float score3; ;,15,main( ) struct student x; x.number=10
9、0001L; strcpy(,zhao1); x.sex=f; x.score0=89; x.score1=94; x.score2=86; printf(number=%ld name=%s sex=%cn, x.number,,x.sex); printf(score1=%f score2=%f,x.score0,x.score1); printf( score3=%fn,x.score2); ,16,例2 :用下面的嵌套的结构体类型为例,说明变量成员的引用。 程序清单如下: #include string.h struct birthday int year; i
10、nt month; int day; ; struct person char name20; char sex; struct birthday bir; float wage; x;,17,main( ) strcpy(,gu); x.sex=f; x.bir.year=1972; x.bir.month=10; x.bir.day=3; x.wage=2880.0; printf(name=%s sex=%c wage=%fn, ,x.sex,x.wage); printf(birthday=%4d.%2d%2dn, x.bir.year,x.bir.month,
11、x.bir.day); ,18,2、结构体类型变量成员地址的引用方法 结构体类型变量成员地址的引用格式如下: char name20; ,20,main( ) struct student2 x; long *p_number; char *p_name; p_number= ,21,3、结构体类型变量地址的引用方法 结构体类型变量地址的引用格式如下: char name20; char sex; float score3; ; struct student s3=200001L,qian2,m,78,86,92, 200002L,sun3,f,85,69,82, 200003L,li4,m,
12、84,88,96;,23,2、定义结构体类型的同时定义数组并赋初值 例:struct student long number; char name20; char sex; float score3; s3=200001L,qian2,m,78,86,92, 200002L,sun3,f,85,69,82, 200003L,li4,m,84,88,96;,24,3、定义无名称的结构体类型的同时定义数组并赋初值。 例:struct long number; char name20; char sex; float score3; s3200001L,qian2,m,78,86,92, 20000
13、2L,sun3,f,85,69,82, 200003L,li4,m,84,88,96;,25,二、结构体类型数组元素成员的引用,例:#include string.h struct student2 long number; char name20; s4; main( ) s0.number=100001L; strcpy(,sun3); printf(%ld %sn,s0.number,); ,1、结构体类型数组元素成员的引用方法 引用格式: 结构体类型数组名下标.成员名,26,例:下面以结构体类型数组s为例,说明其引用方法: #include string.h
14、 struct student2 long number; char name20; ;,2、结构体类型数组元素成员地址的引用方法 引用格式: long *p_number; char *p_name; p_number= ,28,3、结构体类型数组元素地址的引用方法 引用格式: 结构体类型数组名下标,返回,4、结构体类型数组首地址的引用方法 引用格式: 结构体类型数组名,29,指向结构体类型数据的指针,一、指向结构体类型变量的指针,1、定义指向结构体类型变量的指针变量和定义结构体类型变量的方法基本相同,唯一的区别是在指针变量名的前面加一个指针标记*。,2、当一个结构体类型变量的地址已赋予相同
15、结构体类型的指针变量(即指针变量指向变量),就可以使用下列两种方式来引用该结构体类型变量的成员,其作用完全相同。 方式1 (*指针变量).成员名 方式2 指针变量-成员名,30,方式1比较好理解,其中“*指针变量”就代表了它所指向的结构体类型变量,利用“成员运算符”来引用,其作用相当于“结构体类型变量.成员名”。 方式2是一种新的引用方法,其中的“”称“指向成员运算符”,也简称“指向运算符”。其运算级别和“()”、“”、“.”是同级的。指向运算符的左边必须是已指向某个结构体类型变量或数组元素的指针变量,其右边必须是对应结构体类型数据的成员名。,方式1 (*指针变量).成员名 方式2 指针变量-
16、成员名,31,例 :使用指向结构体类型变量的指针变量处理如下结构体。 程序清单如下: #include string.h struct student2 long number; char name20; x,*p= ,32,C语言规定,定义某个结构体类型时,其成员的类型可以是该结构体类型,但是这个成员只能是指针变量或指针数组,不能是普通变量或数组。,例如下列程序段是正确的,其成员是本结构体类型的指针变量: struct exp int i1; float f2; struct exp *e1; ;,33,二、指向结构体类型数组的指针,1、指针变量指向数组元素 如果一个结构体类型数组元素的地址
17、已赋予相同结构体类型指针变量(即指针变量指向结构体类型数组元素),可以使用下列两种方式来引用该数组元素的成员,其作用完全相同。 方式1 (*指针变量).成员名 方式2 指针变量成员名,34,2、指针变量指向数组首地址 当一个结构体类型数组的首地址已经赋予相同结构体类型的指针变量(即指针变量指向结构体类型数组),可以使用下列两种方式来引用下标为i的数组元素成员,其作用完全相同。 方式1 (*(指针变量i).成员名 方式2 (指针变量i)成员名 这里的指针变量必须是指向某个数组首地址的。,35,例 :使用指向结构体类型数组的指针变量处理如下结构体数组的问题。 程序清单如下:,#include st
18、ring.h struct student2 long number; char name20; s2,*p;,36,main( ) p=s; p-number=100001l; strcpy(*p).name,sun3); (*(p+1).number=200001L; strcpy(p+1)-name,sun4); printf(%ld,%sn,(*p).number,p-name); printf(%ld,%sn,(p+1)-number,(*(p+1).name); ,37,三、在函数间传递结构体类型数据,1、在函数间传递结构体类型数据和传递其它类型数据的方法 完全相同,可以使用全局外
19、部变量、返回值、形式参数与 实际参数结合方式(又分为值传递和地址传递两种)。,3、使用形式参数和实际参数结合方式传递结构体类型数据, 要注意是单向的值传递还是双向的值传递。使用值传递方式, 通常形式参数要说明成某种结构类型,而对应的实际参数必 须是同一种结构体类型。如果使用地址传送方式,要区分不同的 情况。如果形式参数被说明成某种结构体类型的指针变量,则实 际参数必须是同一种结构体类型的变量地址、数组名、已赋值的 指针变量;如果形式参数是某种结构体类型数组,则对应实际参 数必须是同一种结构体类型的数组或指针变量。,2、使用返回值方式传递结构体类型数据,函数的返回值必须 是某种已定义的结构体类型
20、指针。,38,例:设学生信息如下:学号(长整型)、姓名(字符 串型)、年龄(整型)。试编函数输入10个学生的信息, 在主函数中先调用该函数输入,然后再输出。,(1)采用“全局外部变量方式传递数据”的程序清单如下: #define N 10 struct student3 long num; char name20; int age; stuN;,39,void my_in( ) int i; for (i=0;iN;i+) scanf(%ld, ,40,(2)采用“返回值方式传递数据”的程序清单如下: #define N 10 struct student3 long num; char na
21、me20; int age; ; struct student3 *my_in(stu1),41,struct student3 stu1; int i; for (i=0;inum,p-name,p-age); ,42,(3)采用“形式参数和实际参数结合的地址传递方式双向 传递数据”的程序清单如下:,#define N 10 struct student3 long num; char name20; int age; ; void my_in(stu1),43,返回,struct student3 stu1; int i; for (i=0;iN;i+) scanf(%ld, ,44,结构
22、体类型应用程序设计例题,例1 设有学生信息如下:学号(长整型)、姓名(字符串 型)、年龄(整型)、课程1成绩(实型)、课程2成绩(实 型)、课程3成绩(实型)、课程4成绩(实型)、课程5成 绩(实型)、课程6成绩(实型)、课程7成绩(实型)、总 分(实型)、平均分(实型)。试编一个程序,输入10个学 生的上述信息,计算每个学生的总分、平均分,然后输出每 个学生的学号、姓名、总分、平均分。,45,程序清单如下:,#define N 10 #include math.h struct student2 long num; char name10; int age; float score7; fl
23、oat total; float average; stuN; main( ) int i,j; char s81; for (i=0;iN;i+); scanf(%ld,%d,46,for (j=0;j7;j+) scanf(%s,s); stui.scorej=atof(s); for(i=0;iN;i+) stui.total=0; for(j=0;j7;j+) stui.total+=stui.scorej; stui.average=stui.total/7.0; printf(学号 姓名 总分 平均分n); for (i=0;iN;i+) printf(%-6ld%-10s%6.2
24、f%6.2fn,stui.num,, stui.total,stui.average); ,47,例2 设有学生信息如下:学号(长整型)、姓名(字符串 型)、出生年月(其中含有年份、月份、日,均为整型)。 试编一个程序,输入10个学生的上述信息,输出所有学生 的学号、姓名和年龄。,程序清单如下:,#define N 10 #include stdio.h #include dos.h main( ) struct birthday int year; int month; int day; ; struct long num;,48,char name20; struct b
25、irthday bir; stuN; struct date today; int i; for (i=0;iN;i+) scanf(%ld, ,返回,49,共用体类型,共用体类型数据中所有成员只占用相同的内存单元,设置这种数据类型的主要目的就是节省内存。,例如,在一个函数的三个不同的程序段中分别使用了字符型变量c、整型变量i、单精度型变量f,我们可以把它们定义成一个共用体类型变量u,u中含有三个不同类型的成员。此时,给三个成员一共分配4个内存单元,3个成员之间的对应关系如下图所示:,共用体类型变量u,成员c,成员i,成员f,50,还可以看出,一个共用体类型所占用的内存单元数目等于占用单元数最
26、多的那个成员的单元数目。对u变量来说,占用的内存单元数是其中成员f所占用的单元数,等于4;而作为三个独立的变量所占用的内存单元数为7,可节省3个内存单元。,一、共用体类型的定义,定义共用体类型的方法如下: union 共用体类型 数据类型1 成员1名; 数据类型2 成员2名; . . 数据类型n 成员n名; ;,51,例如,为了节省内存,可以将不同时使用的三个数组定义在如下的一个共用体类型中,总计可节省300个单元: union c_i_f char c1100; int i2100; float f3100; ;,52,二、共用体类型变量的定义,共用体类型变量、数组的定义和结构型变量、数组的
27、定义方法相同,也有三种: (1)先定义共用体类型,然后定义变量、数组; (2)同时定义共用体类型和变量、数组; (3)定义无名称的共用体类型同时定义变量、数组。,特别提醒注意的是,对共用体类型变量、数组的定义不能赋初值,只能在程序中对其成员赋值。,53,例3 共用体类型变量和数组定义例。 将含有10元素的整型数组i_a10、3行4列的字符行数组c_a34、长整型数据l、双精度数据d定义成一个共用体类型,然后定义这种类型的变量u1,数组u25。,(1)先定义共用体类型,然后定义变量u1与数组u25。 union u int i_a10; char c_a34; long l; double d;
28、 ; union u u1,u25;,54,(2)同时定义共用体类型和变量u1与数组u25。 union u int i_a10; char c_a34; long l; double d; u1,u25;,(3)定义无名称的共用体类型同时定义变量u1与数组u25。 union int i_a10; char c_a34; long l; double d; u1,u25;,55,三、共用体类型变量的引用,1.共用体类型变量或数组元素的引用格式如下: 共用体类型变量名.成员名,2.共用体类型变量成员地址的引用和指针变量的使用方法使用格式如下: 指针变量= char em2; ; struct
29、person3 long num; char name10; int age; union u2 score; ; #define N 10 main( ) struct person3 perN,*p; int i;,58,for (i=0;iN;i+) scanf (%ld,59,for(;pagescore.em1=60)|(p-age=35 ,返回,60,枚举类型,一、枚举类型的定义,定义方法如下: enum 枚举类型名 枚举常量1,枚举常量2,.枚举常量; 其中:枚举类型名是用户给常量取的标识符。该语句定义 了一个名为“枚举类型名”枚举类型,该枚举类型中含有n个枚 举常量,每个枚举常
30、量均有值。c语言规定枚举常量的值 依次等于0、1、2、.、n1。,61,例如,定义一个表示星期的枚举类型: enum week sun,mon,tue,wed,thu,fri,sat; 定义的这个枚举类型共有7个枚举常量,它们的值依次为0、1、2、3、4、5、6。C语言规定,在定义枚举类型时,可以给枚举常量赋初值,方法是在枚举常量的后面跟上“整型常量”。,例如,表示三原色的枚举类型可以定义如下: enum color1 red=2,yellow=4,blue=7;,62,C语言还规定,在给枚举常量赋初值时,如果给其中任何一个枚举常量赋初值,则其后的枚举常量将自然数的规则依次赋初值,请看下例:
31、enum week sun,mon,tue=5,wed,thu,fri,sat; 则枚举常量的初值如下:sun值为0。mon值为1,tue值为5,wed值为6,thu值为7,fri值为8,sat值为9。,63,二、枚举类型变量的定义,1、先定义枚举类型,后定义枚举变量、数组,请看下例。 enum color red,yellow,blue; enum color color_1,color_2;,定义的方法有三种,2、定义枚举类型的同时定义枚举类型变量、数组,请看下例。 enum color red,yellow,blue color_1,color_2;,64,3、定义无名称的枚举类型同时定
32、义枚举类型变量、数组,请看下例。 enum red,yellow,blue color_1,color_2;,三、枚举类型变量的引用,(1)给变量或数组元素赋值,格式为: 枚举类型变量或数组元素同一种枚举类型常量名,65,虽然枚举常量值是0或自然数,但是不能直接将整型常量赋予枚举类型变量或数组元素。但是可以通过类型强制转换来赋值,请看下面的程序段。 enum color red,yellow,blue c_1; c_1=yellow; c_1=1; c_1=(enum color)l; 重要说明:有少数的C编译系统允许将整型常量直接赋予枚举 型变量,例如turbo c。,66,(2)用比较运算
33、符对两个枚举类型变量或数组元素进行“ 大小”的比较,比较时可以按照变量或数组元素的枚举 型常量值(整数)的大小进行。,(3)在循环中用枚举变量或数组元素控制循环,请看下 面的程序段: enum color red,yellow,blue c_1; int k=0; for (c_1=red;c_1blue;c_1+) k+; printf(k=%dn,k);,67,例5 枚举类型数据应用的实例。输入两个整型,依次求出它们的和、差、积并输出。要求用枚举类型数据来处理和、差、积的判断。,程序清单如下:,main( ) enum plus,minus,times op1; int x,y; scan
34、f (%d,%d, ,返回,68,用户自定义类型,用户自定义类型名的方法是通过下列定义语句实现的。,【格式】 typedef 类型名1 类型名2; 其中:类型名1可以是基本类型名,也可以是数组、用户自定义的结构型、共用体类型等,类型名2是用户自选的一个标识符,作为新的类型名。,【功能】将“类型名1”定义成用户自选的“类型名2”,此后可用“类型名2”来定义相应类型的变量、数组、指针变量、结构型、共用体类型、函数的数据类型。,【说明】为了突出用户自己的类型名,通常都选用大写字母来组成用户类型名。,69,1、基本类型的自定义 对所有系统默认的基本类型可以利用下面的自定义类型语句来 重新定义类型名。,
35、【格式】typedef 基本类型说明符 用户类型名;,【功能】将“基本类型说明符”定义为用户自己的“用户类型名”。,例 基本类型自定义例。 typedef float REAL; typedef char CHARACTER; main( ) REAL f1; CHARACTER c1; . . . ,70,2、数组类型的自定义,【格式】typedef 类型说明符 用户类型名数组长度;,【功能】以后可以使用“用户类型名”来定义由“类型说明符”组成的数组,其长度为“数组长度”。,例 数组类型自定义例。 typedef float F_ARRAY20; typedef char C_ARRAY10
36、; main( ) F_ARRAY f1,f2; C_ARRAY name,department; . . . ,71,3、结构型、共用体类型的自定义,【格式】typedef struct 类型说明符 成员1; 类型说明符 成员2; . . . 类型说明符 成员n; 用户类型名;,【功能】以后可以使用“用户类型名”来定义含有上述n个成员 的结构型。,72,例 结构型自定义例。 typedef struct long num; char name10; char sex; STUDENT; main ( ) STUDENT stu1,stu10; . . . ,73,4、指针型的自定义,【格式】 typedef 类型说明符 *用户类型名
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省宜兴市伏东中学初一信息技术《作品的发布和评价》教学设计
- 信息技术应用能力提升培训初中音乐信息化教学设计作业一
- 2026年税务系统遴选面试练习题(含解析)含答案
- 人教版生物八年级下册7.2.4《人的性别遗传》教学设计
- 2026年现场管理培训试题及答案
- (2025年)宜昌市远安县教师职称考试(理论知识)在线模拟题库及答案
- 2026年中职通信工程(移动通信)期末试题
- 高中生物 第一章 孟德尔定律 第二节 自由组合定律教案1 浙科版必修2
- 高中物理人教版必修一 1.1《质点 参考系和坐标系》教学设计
- 高中政治 第二单元 为人民服务的政府 第三课 我国政府是人民的政府 2 政府的责任:对人民负责教学设计4 新人教版必修2
- 2026年全国中级经济师之中级经济师经济基础知识考试综合能力题详细参考解析
- 2026江苏淮安淮阴区国家统计局淮阴调查队招聘编制外工作人员1人笔试参考题库及答案详解
- 2026年云南事业单位考试真题
- 电子书 -失效模式及影响分析 FMEA-AIAG-VDA-第一版
- 检验科实验室标本处理与运输指南
- 中层管理能力提升2026年培训课件
- 2026年衡水学院教师招聘考试参考试题及答案解析
- 2025春人教版七年级英语下册单词默写练习
- 药品注册岗位招聘笔试题(某大型国企)2025年试题集精析
- 消防设施工程公司绩效管理办法
- 福建省招标采购集团公司招聘笔试题库2026
评论
0/150
提交评论