C语言用户自定义数据类型.ppt_第1页
C语言用户自定义数据类型.ppt_第2页
C语言用户自定义数据类型.ppt_第3页
C语言用户自定义数据类型.ppt_第4页
C语言用户自定义数据类型.ppt_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章 用户自定义数据类型 1 本章内容 n8.1 结构类型及其变量的定义 n8.2 结构数组 n8.3 结构和指针 n8.4 联合类型 n8.5 枚举类型 2 8.1.1结构类型的定义 一. 结构类型的概念 前面的我们学习了一些简单数据类型(整型、实 型、字符型)的定义和应用,还学习了数组(一维、 二维)的定义和应用,这些数据类型的特点是:当定 义某一特定数据类型,就限定该类型变量的存储特性 和取值范围。 在日常生活中,我们常会遇到一些需要填写的登 记表,如成绩表、通讯地址、员工信息等。其数据类 型可能由性质不同的成员组成。 3 结构类型的概念 numbernameSexdepartmentage wage 1 wage2 9008806Li FangFInformatio18850780 9008807Lin HongF Personnel 16900760 900880 8 Wu Qiang M Technical 18950790 9008809Li JunM Personnel 17880760 900881 0 Zhang Xia F Technical 17870795 l上表中数据是由员工的工作证号(number)、姓名(name)、 性别(sex) 、年龄(age) 、部门( department) 、工资 (wage)等数据项组成的,逻辑上相关的数据。 l在C语言中,将这种由多个不同类型的数据项组合在一起形成 的数据类型,称为结构体类型。 4 我们可以创建如下的结构类型: struct staff 其中staff由用户命名 char number8; char name10; char sex; int age; char dep20; float wage2; ; 以上定义了一个结构类型struct staff(与int 同 地位),它包含了number、name、sex、age、 dep、wage等不同类型的数据项。 结构类型的概念 5 1结构体类型说明的一般形式 struct 标识符 结构成员列表; ; 说明: (1) struct是关键字,声明要定义一个结构类型,结构类 型名用标示符命名,要“见名知义”; (2)成员列表给出n个成员声明,成员可以基本类型变 量、数组,也可以是另一结构类型变量等,对每个成员 必须作类型说明,成员之间用分号分隔; 二. 结构体类型及结构体变量 6 l l学生的基本信息,学生的基本信息, 包括包括学号、姓名、学号、姓名、 性别、年龄、班级性别、年龄、班级 、成绩、成绩等数据项。等数据项。 l l这些数据项描述了这些数据项描述了 一个学生的几个不一个学生的几个不 同侧面。同侧面。 nonamesexageclassnograde 独立的变量: 数据项之间无关联 nonamesexageclassnograde 数据项为一个整体数据项为一个整体 struct student char no9; /学号 char name20; /姓名 char sex; /性别 unsigned int age; /年龄 unsigned int classno; /班级 float grade; /成绩 7 2.结构类型的几点说明 (1)对于结构类型,系统不会为之分配内存。只有在定义 了结构变量后,系统才会分配内存单元给变量。 (2)结构是由若干个数据项组成,每个数据项都属于一种 已有定义的类型。每一个结构成员都不是独立的,它不 是一般的变量,而是跟结构联系在一起。 struct Student int number char name9; int age; char sex; ; int age; char sex; 同名的age和sex均 不会有命名冲突问题 8 (3)结构类型可以嵌套定义。所谓嵌套定义是指在一 个结构类型中可以包含另一个或一些结构类型, 通常用于结构类型的成员是一个结构变量的场合 。 name birthday sex monthdayyear 结构类型的几点说明 9 结构类型的几点说明 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; ; 10 (4)允许省略结构类型名,即允许定义无类型名的结构类 型。 struct int year; int month; int day; birthday; 无名的结构类型 必须后随结构变量( 如birthday)的定义, 并且仅能一处使用, 这种形式通常用于内 嵌在结构类型中的结 构类型。 (5)可以用sizeof运算符来计算结构类型的长度(字节数) 例如:printf(“%d”,sizeof(struct Student); 结果为18 结构类型的几点说明 11 1.结构类型数据对象包括一般变量、指针、数组等, 对于成为结构变量、结构指针、结构数组等可以在说明 语句中用已定义的结构类型定义结构数据对象,也可以 在定义结构类型的同时定义结构数据对象。 8.1.2结构类型数据对象的定义及初始化 struct date int month; int day; int year; ; ; struct staff char number8; struct date birthday; char sex; ; 定义了结构类型之后, 还必须定义结构类型变量, 类型与变量 是不同的概念。 12 2结构类型变量的三种定义方式 (1) 在说明结构类型的同时, 也定义了结构类型变量 例如: struct book int num; char name60; float price; book1, books3; n在说明结构类型名struct book的同时,定义了结构类型 变量book1与结构类型数组books, 数组books有三个元 素:books0、books1、books2。 结构类型数据对象的定义及初始化 13 (2) 先说明结构类型, 再单独 进行变量定义 例如: struct staff char name10; char sex; float wage2; ; . struct staff worker1, worker2; (3) 省略结构标识符, 直接定 义变量 例如: struct /* 此处没有标识 符*/ int month; char day; unsigned year; d5; 没有标识符一定要在定 义结构类型的同时定义变 量。 结构类型数据对象的定义及初始化 14 定义了结构类型: struce Student 后定义不同变量的 区别: struce Student s1, s2100, *s3= 从上面可以看出: (1) s1是该类型的变量, s2是该类型的一维数组, s3, s4 是指向该类型变量的结构指针; (2) 结构类型的变量名不是地址. 结构类型数据对象的定义及初始化 15 3. 结构类型变量的初始化 可以在定义结构类型变量的同时对其初始化,其语法 格式:struct 标识符 结构变量名=成员初始化值表 struct Student int number char name9; struct int year; int month; int day; birthday; char sex; student1=1101,”lilin”,1985,8,1,M ; 16 定义了结构数据对象,就可以访问其中的每一个成员。 结构成员可以像基本变量那样使用,如赋值、输入输出 、参加表达式的计算等,这些操作统称为对结构成员的 访问。 1、结构成员的表示 结构变量是由n个成员聚合而成的一个整体,要访问其 中的一个成员,必须同时给出整体的名称和个体成员的 名称。 struct Student s1,s2100,*s3= s1是结构变量,用来存放单个学生的信息 s2是结构数组,该数组包含100个类型是struct Student 的成员,这样的数组可以表示一个学生情况 s3是结构指针,存放struct Student 类型数据对象s1 的内存首地址。 9.1.3结构成员的引用 17 (1)结构变量成员的表示: 结构变量 . 成员名 (如 s1.number、s1.age) (2)结构数组元素成员的表示 结构数组名下标表达式.成员名 表示s2的第六个元素(结构变量)之name成 员 (3)结构指针成员的表示 结构指针-成员名 (如 s3-sex) 或 (*结构指针). 成员名 (如 (*s3).sex) 对于多层嵌套结构成员, 有多个“”,从外向内。 结构成员的引用 18 2. 成员运算符 两种成员运算符:“.”和“-” 3.嵌套结构的结构成员的表示 结构成员本身又是结构变量,称为嵌套结构。必须使用 若干个成员运算符来连接多个结构变量及其对应的分量 ,逐级表示到最低一级成员,该级成员是可以直接访问 的基本数据对象。 例如:student1.birthday表示student1中的birthday;而 student1.birthday.year则表示student1中的birthday的 year成员 注意:只能对最内层的成员进行存取、运算以及输入、输 出等操作 结构成员的引用 19 4.结构变量成员的引用 结构变量的成员可以像普通变量一样进行各种运算,如 赋值、输入、输出、计算及地址操作等,例如: student1.birthday.year+; student.number=11001; scanf(“%d”, printf(“%d,%s,%d,%cn“,student1); printf(“%d,%s,%d,%c,%fn”,student1.number,stude ,student1.age,student1.sex); Scanf(“%d,%s,%d,%c,%f”, printf(%o,student1);输出student1的首地址 21 (3)可以将一个结构变量作为一个整体赋给另一个具有相 同类型的结构变量,其作用相当于逐个对位于赋值语句左 部的结构变量的每个分量赋值。如: student2=student1; 等效于: student2.number=student1.number; strcpy(,); student2.sex=student1.sex; 也可以把一个结构变量中的内嵌结构类型成员赋给另一个 结构变量的对应得内嵌结构类型成员,例如 student2.birthday1=student1.birthday1; (4)不允许将一组常量直接赋给一个结构变量。如: student2=“lili”,18,M,12,15,1978,010001,89; 22 例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.birthday1.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; ; 23 补充例 若有以下定义,则正确的赋值语句为( )。 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; 24 8.2结构数组 一个结构体变量中可以存放一组数据(如一个 学生的学号、姓名、成绩等数据)。如果有 个学生的数据需要参加运算,显然应该用数组, 这就是结构体数组。结构体数组与以前介绍过的 数值型数组不同之处在于每个数组元素都是一个 结构体类型的数据,它们都分别包括各个成员( 分量)项。 25 8.2.1结构数组的定义及其应用 1、结构数组的定义 结构数组是基类型为结构类型的数组。它既有结构变量 的属性,又有数组的属性,这样对于成批的结构化数据 ,比如学生数据或职工数据,既便于表示和存储又便于 采用循环语句实现重复处理。 定义结构数组的语法格式: struct 标识符 数组名常量表达式; 或 struct 标识符 成员表 数组名常量表达式; 26 结构数组的定义及其应用 l后定义 struct child char initial; int age; int grade; struct child boy30; l同时定义 struct child char initial; int age; int grade; boy30; l直接定 义 struct char initial; int age; int grade; boy30; 27 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,”wangjing”,1985,7,1,F; 数组的下标说明会省略 Student0 Student1 结构数组的定义及其应用 28 8.2.2对结构数组的操作 1、引用结构数组元素 数组名下标表达式或*(数组名+i) 如:employee2、*(employee+i) 2、引用结构数组元素的成员 employee4.salary 注意: (1)可以像基本变量那样使用,如赋值、输出、计算等 scanf(“%s%c”, , (2)不能将结构数组元素作为一个整体进行输入或输出,但可 以将结构数组元素作为一个整体进行赋值操作 printf(“%d”,employee0);scanf(“%d”, employee0=employee1 29 对结构数组的操作 struct child char initial; int age; int grade; ; struct child boy2= a,5,3,b,4,2; boy1.age+; printf(“%d”,boy1.age) 30 对结构数组的操作 例:struct student int num; char name20; char sex; int age; char addr30; a5; a0. num=060001; a1. name=“Lin Hong“; l一个结构体数组元素 相当于一个结构体变量 ,其处理方法与结构体 变量的处理方法相同 31 对结构数组的操作 例:struct student int num; char name20; char sex; int age; char addr30; a5; gets(); scanf(“%c“, scanf(“%d“, a3 = a0 ; printf(“%s“, 32 对结构数组的操作 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;i #define N 10 /*设备数量*/ struct Device char type; int count; ; 例8.6 34 8.3结构和指针 n结构变量在内存中的起始地址称为结构变量的指 针(简称结构指针)。 n我们可以声明一个指针变量,用来存放该地址, 那么它就指向一个结构变量。 n引入结构指针的主要目的是实现结构变量的动态 存储分配以及函数之间的双向数据传递。 n当然,结构变量的成员也可以使指针,甚至可以 是指向相同类型结构变量的指针,这是构造链表 的基础。 35 8.3.1指向结构变量的指针 1.定义指向结构变量的指针 struct 结构体名 *结构体指针名; 例 struct child *p; 存放结构体变量在 内存的起始地址 struct child char initial; int age; int grade; boy ; struct child *p= int age; int grade; boy, *p1, *p2; p1 = p2 = NULL; struct child *p = 37 3.通过指针来引用结构变量成 员 指向运算符 优先级: 1 结合方向:从左向右 例 int n; int *p= *p=10; n=10 struct student stu1; struct student *p= stu1.num=101; (*p).num=101 (1)(*结构体指针).成员名 例如:(* p).num (2)结构体指针-成员名 例如:p- num 38 例8.7 #include #include struct Student long num; char name20; int age; char sex; ; void main() struct Student student,*p; p= strcpy(,“wang li“); student.num=89101; student.age=18; student.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); 39 8.3.2指针变量作为结构成员 #include struct Student int number; char *name; ; void main() struct Student stu=1101,“lili“; printf(“%sn“,); 40 指针变量作为结构成员 #include struct Student int number; char *name; ; void main() struct Student stu; scanf(“%d“, =(char *)calloc(21,sizeof(char); scanf(“%s“,); printf(“%sn“,stu.number); printf(“%sn“,); 指针变量如果没有初始化, 它的指向是不确定的,也即不 可用。必须调用calloc函数为 其申请内存空间 41 指针变量作为结构成员 1. 指针类型的成员变量要赋值时需分配内存空间 2.如果变量的空间分配通过内存分配函数完成,最后还要释 放这块内存区域。 l 介绍三个存储管理库函数,原型说明在 “alloc.h”头文件 中,使用包含到源程序中 动态动态 分配存储储区函数malloc( ) 函数原型:void *malloc(unsigned size); 调调用格式:malloc(size) 功能:在内存分配一个size字节节的存储储区。调调用 结结果为为新分配的存储储区的首地址,是一个void 类类型指针针。若分配失败,则则返回NULL(即0)。 42 指针变量作为结构成员 动态分配存储区函数calloc( ) 函数原型: void *calloc(unsigned int n,unsigned int size); 调用格式:calloc(n,size) 功能:在内存分配一个n倍size字节的存储区。 调用结果为新分配的存储区的首地址,是一个 void 类型指针。若分配失败,则返回NULL(即0)。 43 指针变量作为结构成员 释放动态分配存储区函数free( ) 函数原型:void free(void *p); 此函数无此函数无 返回返回值值值值 实参必须是一个指向动态分配存储区 的指针,它可以是任何类型的指针变量。 调调用格式:free(p) 功能:释释放p所指向的动态动态 分配的存储储区。 44 8.3.3指向结构数组的指针 可以定义一个结构指 针指向一个结构数组, 也就可以利用该指针间 接访问结构数组的元素 。 Struct A int a; float b; arr3,*p; p=arr; 1 1.5 2.5 2 3.5 3 arr0 arr1 arr2 p arr 1 1.5 2.5 2 3.5 3 arr0 arr1 arr2 p arr 45 指向结构数组的指针 (1)p-a; 得到p指向的结构数组元素中的成员a的值 (2)( p+)-a; 先得到p指向的结构数组元素中的成员a的值,然后再对p 指针加1 (3)(+ p)-a; 先让p指针加1,然后得到p指向的结构数组元素中的成员 a的值 (4)( p-a)+; 先得到p指向的结构数组元素中的成员a的值,然后再对得到 的值加1 46 例8.9 #include struct Student int 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); 47 8.3.4结构指针作为函数参数 1结构体变量作为函数的形参的三种形式: (1)以结构体变量的成员作为参数,传递结构体 变量的成员的值。 (2)以结构体变量作为参数,直接传递结构体变 量的值。 结构变量整体传送,即将实参结构体变量的各 个成员的值逐个传递给形参结构体变量的对应成 员。 注意,实参与形参必须是相同结构体类型的变 量。 (3)以结构体指针作为参数,传递结构体变量的 地址。 48 例8.10:输出学生的姓名与年 龄 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 = age(p+1); 49 例: 计算三个学生的总分和平均分(利用结构指针)。 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(); 50 结构类型的应用 例:定义一个包括年、月、日成员的结构类型变量,输入 一个符合常规的日期,算出该日期是这一年中的第几天 并输出。 【分析】这里主要存在一个闰年问题,也就是当该年为闰 年时,二月份有29天,其余为28天。判断该年是否为闰 年的条件是:年份是否能被4整除,但不能100整除;或 能被400整除;当然还要判断输入的日期是否有效以及 各月的天数情况。 51 结构类型的应用 main() struct unsigned year, month, day; x; int 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“, if (x.year%4=0 while (x.year12|x.daymaxdayx.month) ; for (i=1; iage (B) (*+p). age (C) (*p+). age (D) *(+p)- age 53 课 堂 练 习 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) printf(“%cn“, 1); 54 8.4.1联合的概念及联合类型定义 1联合类型的概念: 将若干个变量组织在一起,使它们 能在不同的时间占用同一段内存空间,这种数据组合对 应得数据类型称为联合类型或共同体类型。 2.定义联合类型 union 联合类型名 (union是C语言关键字) 成员列表; ; 55 例如: union abc (union是C语言关键字) char ch; int i; float f; v; 以上说明了一个联合类型: union abc, 同时定义一个 联合类型变量v。 内存高地址 内存低地址 符变量ch 占1字节 整型变量 i 占2字节 单精度实型变量f占4字节 联合的概念及联合类型定义 56 l l 构造数据类型,也叫构造数据类型,也叫共用体共用体 l l 用途用途: :使几个不同类型的变量使几个不同类型的变量共占共占1 1段内存段内存( (相互覆盖相互覆盖 ) ) union 联合体类型名 数据类型名1 成员名1; 数据类型名2 成员名2; ; 类型定义不分配内存 p 联合体的大小 是成员中占内存最 大的成员的大小 共占4字节 最新存储的数 据是有效的 联合的概念及联合类型定义 57 说明: (1) 系统为所有联合类型成员分配同一地址开始的存储空间 , 使用覆盖的方式共享存储单元。 例:用数组作联合类型的成员 union utp1 unsigned char b2; unsigned w; r1; 本例联合类型中, 定义了一个数组成员b。可以用 r1.b0存取r1.w低字节的值, 用r1.b1存取r1.w高字节 的值。例如下列程序段: r1.w = 0x6141; printf(“%c, %c, %un“, r1.b0, r1.b1, r1.w); 输出结果是:A, a, 24897 w 4161 b1b0 联合的概念及联合类型定义 58 (2) 联合类型也允许嵌套定义,例如: union utp struct char low, high; b; unsigned w; r ; 以上在联合类型中, 定义了一个结构类型成员b, 如 上图所示。本例中可以用r.b.low存取r.w的低字节的值, 而用r.b.high存取r.w的高字节的值, 也可以用r.w一次存 取双字节的值。 w b.lowb.high 联合的概念及联合类型定义 59 (3) 联合类型变量所占空间的大小取决于占存储空间最大的 那个成员。例如上述例子中(图4.13所示), sizeof(u_type)或sizeof(v)的值均为, 因为成员ch、i 、f中, f占个字节的存储空间, 是占空间最大的。 (4) 由于联合类型变量中所有成员共享存储空间, 因此变量 中的所有成员的首地址相同, 而且联合类型变量的地址 也就是该变量成员的地址。 int a3; float b; ); 共用体类型union xy的存储单元中各成员占用空间情况如 图: 则共用体类型union xy的长度是6(占用内存的字节数)。 ch a0 a1 a2 b 联合的概念及联合类型定义 61 8.4.2联合变量的定义及成员的引用 1.定义联合变量 共用体变量的定义有如下三种处理方式: (1)先定义共用体类型,再定义共用体变量。 例1:union xy char ch; int a3; float b; ; /*定义共用体类型union xy */ union xy x,y; /*定义x、y为共用体类型union xy的变量*/ 62 联合变量的定义及成员的引用 (2)在定义共用体类型的同时定义共用体变量。 例2:union xy char ch; int a3; float b; x,y; (3)直接定义共用类型变量。 例3:union char ch; int a3; float b; x,y; 63 联合体与结构体的异同联合体与结构体的异同 l联合体与结构体都是由多个成员分量组成的一个 整体; l联合体与结构体在定义、说明和使用(成员引用 、指针)上十分相似。 n结构体:多个成员分量分别占用不同的存储空间 构成一个整体;成员分量之间是相互独立的,所 进行的各种操作互不影响。 n n 联合体联合体:多个成员分量共同占用同一占用同一存储空间; 成员分量分量之间是相互联系相互联系的,所进行的操作相互 依赖。 64 联合体与结构体的异同联合体与结构体的异同 n n 注意注意:联合在一个时间里不能三个成员同时起作 用,而只能有一个成员在起作用,而且是最后被 赋值的成员;而结构在任何一个时间都是三个成 员同时在起作用。 n联合变量的长度等于类型最长的成员的长度,而 结果变量的长度等于所有成员长度之和。 n可以在定义结构变量时对每个成员初始化,而不 能在定义联合变量时进行初始化。 65 联合体与结构体的异同联合体与结构体的异同 特别注意: 联合类型变量在定义的同时只能对第一个成员的 值进行初始化。(因为其它成员的赋初值会改变第一个成 员的值) 例如: union utype int i; char j; x=65; 以上在定义联合类型变量给 x.i 赋初值65, x.j 赋初值A 。 66 2.联合成员的引用 与结构变量一样,对联合变量只能在成员级别上进行操作 (称为联合成员的引用),不能直接操作联合变量。联合 成员也可以通过定义指向联合的指针来引用。 union data int a; float b; char c; data1, *p= 要引用其中的成员b, 可用以下三种格式: data1.b p-b (*p).b 联合类型某一成员赋值, 会覆盖其它成员原来的数据, 原来 成员的值就乱了,因此, 多次赋值, 起作用的可能是最后一次 存入的成员的值。 67 例:假设有一个unsigned long 类型整数,分别将其前2 个字节和后2个字节作为两个unsigned int类型输出。 main() union unsigned long k; unsigned a2; x; x.k=0x2e314fdd; printf(“%x, %xn“, x.a0, x.a1); getch(); 联合成员的引用 68 8.5枚举类 型 n实际应用中,某些变量只有几种可能的值, 例如在模拟扑 克牌的游戏中, 扑克牌只有四种花色(梅花、方块、红桃 、黑桃), 可以把这种变量定义成枚举类型。 n所谓枚举,是将具有相同属性的一类数据值一一列举。 例如:表示星期的Sunday,Monday,Tuesday, Wednesday,Thursday,Friday,Saturday就是一个 枚举。 n枚举是一个具有有限个整型符号常量的集合,这些整型 符号常量称为枚举常量。 n枚举类型就是将变量的可取值一一列举出来, 变量只能取 其中之一的值. 69 8.5.1 枚举类型的定义 enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; enum color1 blue, green, red ; enum flag false, true ; l l enumenum是关是关键键字字; l l 枚枚举举名和枚名和枚举举常量常量 是是标识标识 符符; l l 枚枚举举常量之常量之间间用逗用逗 号分隔号分隔。 1. 枚举类型的定义 enum 枚举名 标识符1=整型常数, 标识符2=整型常数, ; 70 枚举类型 n例如: enum cards club, diamond, heart, spade card1, card2; n定义了一个枚举类型enum cards的同时定义了二个该类 型的枚举型变量card1与card2,它们的值只能是club, diamond, heart, spade之一。 n例如: card1 = club; card2 = spade; 是合法的赋值语句。 71 说明: (1)enum是C语言的关键字, 用于说明枚举类型以及定 义枚举变量。再看几个定义: enum weekday Mon, Tue, Wed, Thu, Fri, Sat, Sun; /*说明枚举类型*/ enum colors red, green, bluebackcolor, forecolor; /*说明枚举类型的同时定义枚举型变量*/ enum weekday workday, week_end; /*用已定义好的枚举类型定义枚举变量*/ 说明: 72 枚举类 型 (2)枚举类型的说明和变量定义有两种方式(如上), 第一 种方式把定义和说明分开; 第二种方式在说明枚举类型 的同时定义枚举变量。 (3)枚举类型名和枚举值均为用户定义的标识符(不能是 双引号括起来的字符串或数值)。枚举值又称为枚举元素 、枚举常量, 系统将枚举值作为整型常量来处理。因为 是常量, 因此不能在程序执行时被赋值, 也不能与其它标 识符同名。 枚举值是常量,不是变量。若定义了上述几种枚举类 型, 以下语句是非法的: int red; 或 Mon=1; 73 枚举类型 (4)如果省略”=整型常量”, 编译程序按顺序给每个枚举 元素一个对应的整数值, 整数值从0开始, 后续元素顺序 加1。例如上面的例子中, Mon的值为,Tue的值为1, ., Sun的值为6。 可以在定义时指定枚举元素对应的整数值, 没有指定 整数值的元素则在前一元素序号值的基础上顺序加1。 例如: enum weekdaySun=7,Mon=1, Tue, Wed, Thu, Fri, Sat; 此时Sun的值为7, Mon的值为1, Tue的值为2 , ., Sat的值为6。 74 枚举类型 也可以指定枚举元素对应的值是负整数, 以后的枚举元 素值仍依次加1。例如: enum operator plus, minus= -3, times, divide; 则plus的值为0, minus的值为-3, times的值为-2 , divide的值为-1。 (5)每个枚举元素之间用逗号”,”隔开, 而不是用分号”;” 隔开。 (6)用printf函数输出用%d, 而不能用%s 75 枚举类型 (7)枚举变量只能取枚举类型说明结构中的某个枚举元素 , 若要对枚举变量赋整数值必须进行强制类型转换。例 如: enum weekday Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat workday, week_end; workday=Mon; week_end=(enum weekday) (6); /* 相当于week_end=Sat;*/ (8) 枚举变量可以进行加(减)一个整数n的运算。例如: workday=Mon; workday +; /*此时workday的值变成Tue*/ 76 枚举类型 void main() enum weekday sun, mon, tue, wed, thu, fri, sat a,b,c; a=sun; b=mon; c=tue; printf(“%d,%d,%d“, a, b, c); n运行结果如下: n0,1,2 枚举变量取枚 举说明结构中的某 个标识符常量后, 其值可认为是标识 符对应的常数 77 用 typedef 定义类型别名 nC语言中, 可以使用关键字”typedef”对已有的类型说明 一个新名称。格式为: typedef 类型名 类型别名; n上述只说明了一个数据类型的新名字, 而不是产生了一 种新的数据类型, 原有类型名依然有效。例如: typedef float REAL; n使用上述说明后, REAL就成了float的代名词。此后,可 用标识符REAL来定义单精度实型变量。例如: REAL x, y; /* 等价于 float x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论