《c语言程序设计基础》7构造数据类型_第1页
《c语言程序设计基础》7构造数据类型_第2页
《c语言程序设计基础》7构造数据类型_第3页
《c语言程序设计基础》7构造数据类型_第4页
《c语言程序设计基础》7构造数据类型_第5页
已阅读5页,还剩79页未读, 继续免费阅读

下载本文档

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

文档简介

1、第7章 构造数据类型,第7章 构造数据类型,本章内容,7.2 结构体与结构体类型变量的定义,7.3 结构体变量的使用及初始化,7.4 结构体数组,7.1 构造数据类型概述,7.5 结构体指针,第7章 构造数据类型,本章内容,7.7 共用体,7.8 枚举类型,7.9 用typedef定义类型,7.6 结构体作函数参数,7.1 构造数据类型概述,构造数据类型是C语言的一个特色,它是由一些简单数据类型构造而来的。 前面所学的数组就是其中最基本的的一种。数组是由若干类型相同的元素构成,在内存中占用一块连续的区域并且按顺序存放,例如学生成绩单、字符串、矩阵、数据表格等都可以用数组来表示,它们的元素具有同

2、样的数据类型。 但在实际程序设计中,我们经常要把一些类型不同却又紧密联系的数据项组织在一起加以处理。,7.2 结构体与结构体类型变量的定义,本节内容,7.2.2 结构体变量的定义,7.2.1 结构体的定义,7.2.1 结构体的定义,就本质而言,结构体是一种较为复杂的构造类型数据。它是由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员也叫成员变量。在使用结构体类型前我们首先要对结构体内所包含信息作一说明,即定义结构体。,struct 结构体名 数据类型1 成员名1; 数据类型2 成员名2; 数据类型n 成员名n; ;,7.2.1 结构体的定义,struct为关键字,它表示一个结构体

3、定义的开始,它与其后的结构体名一起代表某一特定的结构体类型。 结构体名是由用户自己定义的合法标识符。 成员表列由一对花括号括起来,其中每个成员都是该结构体的一个组成部分,并且必须列出其类型和变量的名称。结构体中各成员之间用分号隔开。 并且结构体定义也是用分号作为结束标志的,此处的分号不能省略,因为结构体定义在程序中就是一条说明语句。,7.2.1 结构体的定义,在定义结构体时,有以下几点说明: 定义结构体类型只是说明该类结构体数据的组织形式,在程序编译时系统不会给结构体类型分配空间,只有定义了结构体变量,系统为该结构体变量分配空间。,struct date int year; int month

4、; int day; ; struct date da1,da2;,7.2.1 结构体的定义,结构体成员可以是任何基本数据类型的变量,如int、char、float、double等,也可以是数组、指针类型的变量。这些成员变量可以是同一类型也可以是不同类型。,struct student int num; char name20; int *age; char sex; float score4; ;,7.2.1 结构体的定义,结构体类型可以嵌套定义,即结构体成员也可以是结构体类型的变量。,struct student int num; car name20; int age; char sex

5、; struct date int year; int month; int day; birthday; ;,struct date int year; int month; int day; ; struct student int num; char name20; int age; char sex; struct date birthday; ;,7.2.2 结构体变量的定义,为了能够在程序中使用结构体类型,必须定义结构体类型的变量,定义结构体变量的方法主要有以下四种: 先定义结构体类型,再定义结构体变量。,struct student int num; char name20; c

6、har sex; float score5; ; struct student stu1,stu2;,7.2.2 结构体变量的定义,在定义结构类型的同时定义结构体变量。 直接说明结构体变量。,struct student int num; char name20; char sex; float score5; stu1,stu2;,struct int num; char name20; char sex; float score5; stu1,stu2;,7.2.2 结构体变量的定义,先使用typedef定义结构体类型,给结构体类型起别名,再用别名定义结构体变量。 这样在定义结构体变量的时

7、候就可以既使用新的类型studentinfo来定义变量,又可以用struct student 来定义变量,,typedef struct student int num; char name20; char sex; float score5; studentinfo; studentinfo stu1,stu2;,typedef struct int num; char name20; char sex; float score5; studentinfo;,7.2.2 结构体变量的定义,按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,

8、结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。以上定义的结构体变量各成员所占内存单元如表所示(以VC环境为例):,7.3 结构体变量的使用及初始化,本节内容,7.3.2 结构体变量的初始化,7.3.1 结构体变量的使用,7.3.1 结构体变量的使用,结构体作为一种新的数据类型,在定义结构体变量之后,可以像基本类型变量一样赋值、运算,不同的是结构体变量不能整体引用,只能引用它的成员变量。 结构体成员变量使用的一般方式 结构体变量名.成员名 birthday.year、birthday.month、birthday.day,birthday.year = 1988;

9、 birthday.month= 2; birthday.day = 14,7.3.1 结构体变量的使用,可以将一个结构体变量赋值给另一个结构体变量。 进行赋值的结构体变量必须是同一类型的结构体变量。如果stu1已经赋值,则可以通过语句stu2=stu1将stu1的值赋给同类型的结构体变量stu2。,struct student int num; char name20; char sex; float score5; ; struct student stu1,stu2;,7.3.1 结构体变量的使用,#include typedef struct char name10; int age;

10、 STD; STD fun(STD std, int n) STD max; int i; max=std1; for(i=0; in; i+) if(max.agestdi.age) max=stdi; return max; main( ) STD std5=A01,18,A02,17,A03,16,A04,17,A05,19 ; STD max; max=fun(std,5); printf(The result: ); printf(nName : %s, Age : %dn,,max.age); ,7.3.1 结构体变量的使用, 嵌套结构体中成员变量的使

11、用 对于嵌套的结构体,如果要使用内部嵌套的结构体的成员变量,则需要连续的使用“.”运算符。 使用内部结构体的成员变量month用“stu1.date.month”的形式。,struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2;,7.3.1 结构体变量的使用,#include typedef struct int num; char name10; char sex; struct int year,month,day ; birthday; float

12、 score3; STU; void show(STU tt)/定义函数show int i; printf(%d %s %c %d-%d-%d, tt.num, , tt.sex, tt.birthday.year, tt.birthday.month, tt.birthday.day); for(i=0; i3; i+) printf(%5.1f, tt.scorei); printf(n); main( ) STU std= 1,LiuYang,M,1980,5,18,82.5,69.0,85.0 ; printf(A student data:n); show(std);

13、 ,7.3.2 结构体变量的初始化,对应结构体变量的定义形式,结构体变量初始化也有四种方法:,方法一: struct 结构体名 类型名 成员名; 类型名 成员名; . ; struct 结构体名 结构体变量=初值表;,方法二: struct 结构体名 类型名 成员名; 类型名 成员名; . 结构体变量=初值表;,方法三: struct 类型名 成员名; 类型名 成员名; . 结构体变量=初值表;,方法四: typedef struct 结构体名 类型名 成员名; 类型名 成员名; . 结构体名1; 结构体名1 结构体变量=初值表;,初始表中数据的个数应和成员项一致,各初值间用逗号隔开。按成员的

14、先后顺序对应赋值,如果初值个数少,则将无初值对应的成员赋以0值。如果初值个数多,则编译出错。有嵌套结构的结构体类型,赋初值也一一对应。,struct date int year, month, day; ; struct student char num8, name20, sex; struct date birthday; float score; a=“0506011,Liu Qing,M,1980,12,9,83, b=“0508015,Zhao Ying,F,1981,3,20,86,c;,#include struct student int num; char *name; ch

15、ar sex; float score; stu2,stu1=1002,Liu Qing,M,82.5; /定义全局结构变量 main() stu2=stu1; printf(Number=%dnName=%sn,stu2.num,); printf(Sex=%cnScore=%fn,stu2.sex,stu2.score); ,#include main() struct student/定义结构 int num; char *name; char sex; float score; stu2,stu1=1002,Liu Qing,M,82.5;/定义局部结构变量 stu2

16、=stu1; printf(Number=%dnName=%sn,stu2.num,); printf(Sex=%cnScore=%fn,stu2.sex,stu2.score); ,7.4 结构体数组,本节内容,7.4.2 结构体数组的初始化,7.4.3 结构体数组的使用,7.4.1 结构体数组的定义,7.4.1 结构体数组的定义,先定义结构体类型,再定义结构体数组。 在定义结构类型的同时说明结构体数组。,struct student int num; char name20; char sex; int age; ; struct student stu2;,struct

17、 student int num; char name20; char sex; float score; stu5;,7.4.1 结构体数组的定义,直接说明结构体数组。 使用typedef定义结构体类型,再定义数组。,struct int num; char name20; char sex; int age; stu2;,typedef struct student int num; char name20; char sex; int age; studentinfo; studentinfo stu2;,7.4.2 结构体数组的初始化,定义结构体类型时初始化结构体数组。,struct

18、结构体名 成员表; 数组名大小=初值表;,struct student int num; char *name; char sex; float score; stu5=101,Li ping,M,45,102,Zhang ping,M,62.5, 103,He fang,F,92.5,104,Cheng ling,F,87, 105,Wang ming,M,58;,先定义结构体类型,然后定义结构体数组并初始化。,struct 结构名 成员表; ; struct 结构名 数组名大小=初值表;,struct student int num; char *name; char sex; float

19、 score; ; struct student stu5= 101,Li ping,M,45, 102,Zhang ping,M,62.5,103,He fang,F,92.5, 104,Cheng ling,F,87,105,Wang ming,M,58; ,7.4.3 结构体数组的使用,可以把一个数组元素赋予另一个数组元素,从而实现结构变量之间的整体赋值。 students3=students2; 可以单独地把一个结构体数组元素中的一个成员的值赋予另一数组元素中的一个同类型的成员。 students3.num=students2.num 一旦定义了一个结构体数组,编译时就为它分配一片连续

20、的内存空间。和其他类型的数组一样,各数组元素是连续存放的,只是结构体数组的元素是定义过的结构体类型数据。,#include struct student int num; char *name; char sex; float score; stu5=101,Li ping,M,45,102,Zhang ping,M,62.5, 103,He fang,F,92.5,104,Cheng ling,F,87, 105,Wang ming,M,58 ;,7.4.3 结构体数组的使用,main() int i,c=0; float ave,sum=0; for(i=0;i5;i+) sum+=stu

21、i.score; if(stui.score60) c+=1; printf(sum=%fn,sum); ave=sum/5; printf(average=%fncount=%dn,ave,c); ,#includestdio.h #define NUM 3 struct mem char name20; char phone10; ; main() struct mem peopNUM; int i; for(i=0;iNUM;i+) printf(input name:n); gets(); printf(input phone:n); gets(peopi.phone

22、); printf(namettphonen ); for(i=0;iNUM;i+) printf(%stt %sn,,peopi.phone); ,7.5 结构体指针,本节内容,7.5.2 指向结构体数组的指针,7.5.1 结构体指针的定义及使用,7.5 结构体指针,结构体变量被定义后,系统为其在内存中分配一片连续的存储单元。该片内存单元的起始地址称为该结构体变量的指针。如果我们定义一个指针变量,用来存放这个地址,就称该指针变量为指向结构体的指针变量,简称结构体指针。,7.5.1 结构体指针的定义及使用,先定义结构体类型,再定义结构体指针。 在定义结构类型的同时说明结构体

23、指针。,struct student int num; char name20; char sex; int age; ; struct student stu1,*pstu;,struct student int num; char name20; char sex; float score; stu1,*pstu;,7.5.1 结构体指针的定义及使用,直接说明结构体指针。 用typedef定义结构体类型,再定义结构体指针。,struct int num; char name20; char sex; int age; stu1,*pstu;,typedef struct student i

24、nt num; char name20; char sex; int age; studentinfo; studentinfo stu1,*pstu;,经过上面定义之后,此时pstu尚未指向任何具体的对象,是所谓的野指针。 要使pstu指向stu1,则须:pstu= 把字符串“Liu Qing”的首地址赋予stu1中的name: pstu-name= Liu Qing;,利用间接访问运算符“*”来存取所指向结构体变量的成员,其一般引用形式是: (*指针变量名).成员名 (*pstu).name =Liu Qing; 执行后,就使pstu所指向的结构体变量(即stu1)中成员name指向字符串

25、Liu Qing。 (*指针变量名)的圆括号是必须有。如果去掉圆括号,则成为*的形式,由于结构体成员运算符“.”的优先级高于间接访问运算符“*”,该表达式实际上就等价于*(),这与原来表达式的含义是完全不同的。,#includestdio.h struct student int num; char *name; char sex; float score; stu1=102,Liu Qing,M,78.5,*pstu; main() pstu= ,存取结构体成员的方式有三种等价形式: 直接利用结构体变量名,其一般形式是: 结构变量名.成员名 利用指向结构体变量的指针变

26、量和间接成员运算符,其一般形式是: 指针变量名-成员名 利用指向结构体变量的指针变量和间接访问运算符,其一般形式是: (*指针变量名).成员名,7.5.2 指向结构体数组的指针,结构体指针也可以指向一个结构体数组,这时结构体指针变量的值是整个结构体数组的首地址。 结构体指针变量也可指向结构体数组中的某一个元素,这时结构体指针变量的值是该结构体数组元素的首地址。 设pstu为指向结构体数组的指针变量,则pstu也指向该结构体数组的0号元素,pstu+1指向1号元素,pstu+i则指向i号元素。 在程序中既可以利用数组下标形式访问一个数组元素,也可以通过指针变量的操作来存取结构数组元素。,stru

27、ct student int num; char name20; char sex; int age; ; struct student stu5; struct student *pstu; pstu = 通过pstu+, pstu+i, pstu-i等,就可以遍历整个数组。 pstu+是表示结构体指针变量pstu向后移动一个“位置”, 增加所指对象的字节数。,#includestdio.h struct student int num; char name20; char sex; float score; stu5=1101,Liu Qing,M,76,1102,Zhao Hui,M,8

28、5.5, 1103,Yang Jing,F,69.5,1104,Wu Fang,F,91, 1105,Deng Chao,M,64.5; main() struct student *pstu; printf(NotNametttSextScoretn); for(pstu=stu;pstunum,pstu-name,pstu-sex,pstu-score); ,#includestdio.h struct list int i; char name4; float w; tab4=1,H,1.008,2,He,4.0026, 3,Li,6.941,4,Be,9.01218; main( )

29、struct list *p; printf(NotNametAtomic Weightn); for (p=tab; pi, p-name, p-w); ,7.6 结构体作函数参数,本节内容,7.6.2 结构体指针作函数参数,7.6.1 结构体成员变量作函数参数,7.6.1 结构体成员变量作函数参数,#include struct data int a, b, c; ; void func(struct data parm); main() struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b

30、=%d arg.c=%dn,arg.a,arg.b,arg.c); printf(Call Func().n); func(arg); printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b,arg.c); ,结构体变量作函数参数实现调用函数与被调用函数之间的“数值”传递。,7.6.1 结构体成员变量作函数参数,void func(struct data parm) printf(parm.a=%d parm.b=%d parm.c=%dn, parm.a,parm.b,parm.c); printf(Process.n); parm.a=18; parm

31、.b=5; parm.c=parm.a*parm.b; printf(parm.a=%d parm.b=%d parm.c=%dn, parm.a,parm.b,parm.c); printf(Return.n); ,7.6.2 结构体指针作函数参数,#include struct data int a, b, c; ; void func(struct data *parm); main() struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(arg.a=%d arg.b=%d arg.c=%dn,arg.a,arg.b

32、,arg.c); printf(Call Func().n); func( ,将上例改用结构体指针变量作参数,分析程序运行结果。,7.6.2 结构体指针作函数参数,void func(struct data *parm) printf(parm-a=%d parm-b=%d parm-c=%dn, parm-a,parm-b,parm-c); printf(Process.n); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(parm-a=%d parm-b=%d parm-c=%dn, parm-a,parm-b,parm-c); pri

33、ntf(Return.n); ,7.7 共用体,本节内容,7.7.2 共用体变量的赋值和引用,7.7.1 共用体及共用体变量的定义,7.7 共用体,共用体的特点是将不同类型的变量,例如整型、字符型、实型等放在同一地址开始的内存单元中,虽然各变量在内存中占的字节数不同,但都从同一地址开始。 例如学校对教师和学生所作的信息统计表,对“单位”一项学生应填入班级编号可用整型量表示,教师应填入某系某教研室只能用字符类型。 要求把这两种类型不同的数据都填入“单位”这个变量中,就必须把“单位”定义为既可存放整型数据又可存放字符型数组这两种类型的“共用体”。,7.7.1 共用体及共用体变量的定义,定义共用体类

34、型的一般形式为: union 共用体名 成员表 ;,union data int clas; char office10; ;,7.7.1 共用体及共用体变量的定义,先定义共用体类型,再定义共用体变量。 定义共用体类型的同时定义共用体变量。,union data int clas; char office 10; ; union data a,b;,union data int clas; char office10; a,b;,7.7.1 共用体及共用体变量的定义,直接定义共用体变量。 使用typedef定义共用体类型再定义共用体变量。,union int clas; char office

35、10; a,b;,typedef union ata1 int clas; char office 10; data; data1 a,b;,经定义后的a、b变量均为data类型。它们的内存分配如图所示。a、b变量的长度应等于data 的成员中最长的长度,即等于office数组的长度,共10个字节。 a,b变量如赋予整型值时,只使用了4个字节,而赋予字符数组时,可用10个字节。 一个共用体变量的长度等于各成员中最长的长度,在共用体中各成员变量的值并不是同时存在的,在同一时刻只能有一个变量值存在,如果给其它变量赋值,则原先变量的值被覆盖。,7.7.2 共用体变量的赋值和引用,对共用体变量的赋值、

36、使用都只能通过对变量的成员进行,而不能直接对共用体变量赋值,也不能直接引用共用体变量。通常使用运算符“.”引用共用体的成员变量,例如: a.clas=3; 注意在这种情况下,共用体变量a的当前成员变量为clas,其值为3,此时a的另一成员变量office的值是无意义的。,7.7.2 共用体变量的赋值和引用,还可以通过指向共用体变量的指针引用共用体变量的成员。 不能对共用体变量的所有成员变量进行初始化,只能对成员列表中的第一个变量进行初始化。,union data int clas; char office10; a,*p; p=,union data int clas; char office

37、10; a=3;等价于a.clas=3,7.7.2 共用体变量的赋值和引用,在程序中依次为共用体成员赋值,则最后赋值的成员值有效。,#include #include union data int classes; char office10; a; main() strcpy(a.office,CS); a.classes=3; printf(%dn,a.classes); printf(%sn,a.office); ,7.7.2 共用体变量的赋值和引用,#include main() struct char name10; int age; char job; union int clas

38、; char office10; dept; info2; int n,i;,7.7.2 共用体变量的赋值和引用,for(i=0;i2;i+) printf(input name,age,job and departmentn); scanf(%s %d %c,,7.7.2 共用体变量的赋值和引用,for(i=0;i2;i+) if(infoi.job=s) printf(%st%3dt%3ct %dn, ,infoi.age,infoi.job,infoi.dept.clas); else printf(%st%3dt%3ct%sn, infoi.na

39、me,infoi.age,infoi.job,infoi.dept.office); ,7.8 枚举类型,本节内容,7.8.2 枚举类型变量的赋值和引用,7.8.1 枚举类型枚举变量的定义,7.8 枚举类型,在实际处理问题中,经常会有取值被限定在一个有限的范围内的类型出现。例如,一个星期内只有七天,一年只有十二个月等等。为了便于对这些类型数据的处理,语言提供了一种称为“枚举”的类型。利用枚举类型,可以直观的体现枚举变量的含义和取值限制,在定义枚举类型时,列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。,7.8.1 枚举类型枚举变量的定义, 枚举类型的定义

40、 枚举类型定义的一般形式为: enum 枚举名 枚举值表 ; 在枚举值表中罗列出所有可用值,称为枚举元素。 enum weekday sun,mon,tue,wed,thu,fri,sat ;, 枚举变量的定义 同结构体和共用体一样,枚举变量也可用不同的方式定义:,enum weekday ; enum weekday a,b,c;,enum weekday a,b,c;,enum a,b,c;,typedef enum weekday week; week a,b,c;,7.8.2 枚举类型变量的赋值和引用,在C语言中对枚举类型数据有如下规定: 枚举值是常量,不是变量。所以不能

41、在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值:“sun=5;mon=2;sun=mon;” 都是错误的。 枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2。如在weekday中,sun值为0,mon值为1,sat值为6。,7.8.2 枚举类型变量的赋值和引用,#include 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); ,7.8.2 枚举类型变量的赋值和引用,可以把某个枚举元素规定为指定

42、的整常数: enum weekday sun,mon,tue,wed=10,thu,fri,sat ; 编译程序对wed之前的枚举元素照常从0开始,递增赋予整常数,即sun的值为0,mon的值为1,tue的值为2,并对wed赋予指定值10,然后对wed之后的值在wed的基础上递增赋值,即thu的值为11,fri为12,sat为13。,7.8.2 枚举类型变量的赋值和引用,只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。 如: “a=sum;b=mon;”是正确的。 而:“a=0;b=1;”是错误的。 如一定要把数值赋予枚举变量,则必须用强制类型转换,如:“a=(enum weekd

43、ay)2;”其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于:“a=tue;” 另外枚举元素不是字符常量也不是字符串常量,使用时不要加单、双引号。,7.8.2 枚举类型变量的赋值和引用,#include main() enum body a,b,c,d month31,j; int i; j=a; for(i=1;id) j=a; ,7.8.2 枚举类型变量的赋值和引用,for(i=1;i=30;i+) switch(monthi) case a:printf( %2d %ct,i,a); break; case b:printf( %2d %ct,i,b); break; case c:printf( %2d %ct,i,c); break

温馨提示

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

最新文档

评论

0/150

提交评论