第7章用户定制数据类型.ppt
《第7章用户定制数据类型.ppt》由会员分享,可在线阅读,更多相关《第7章用户定制数据类型.ppt(73页珍藏版)》请在三一文库上搜索。
1、第七章用户定制数据类型,C语言提供有丰富的数据类型:,结构体(struct):也称集合数据类型,用于将不同类型的数据组织在一个名字下。 共用体(union):允许一个存储空间中存储不同类型的变量。 枚举(enumeration):用一组符号代替一组整数。 typedef:用于为已经存在的类型定义新名字。,7.1 结构体类型基础,7.1.1 结构体类型及其定制 1. 结构体类型的概念 现实生活中存在着大量需要作为一个整体来处理的数据,而这些数据的类型又不相同。例如:要处理学籍数据,需要处理学生学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)和地址(addr)等
2、数据。 而数组则无法容纳不同类型的元素。结构体(structure),也称“结构”,就是C语言提供的处理一组不同类型数据的类型。,例如上述处理学籍的结构体类型定制语句为:,struct Student unsigned int num; char name20; char sex; int age; float score; char addr30; ;,struc 结构体名 成员声明表列;,结构体类型的定制 是由声明成员的一组语句组成的,形式为,truct Addr char name30; /* 姓名 */ char street40; /* 街道 */ char city20; /* 城
3、市 */ char provn20; /* 省名 */ unsigned int zip; /* 邮编 */ ,同样的方法可以为建立通信录定制一种数据类型struct Addr:,说明: (1)一个结构体类型的标志由两个单词组成:第一个单词为关键struct,它表明该类型是一种结构体类型;第二个单词是结构体名,如前面介绍的Student、Add,由程序设计者按标识符规则指定。这二者联合起来组成一个“类型标识符”即“类型名”,相当与int。,(2)age,sex,num不能称为变量名,而是结构体类型struct person的成员名。在一个函数中,可以另外定义与结构体类型的成员相同名的变量,它们
4、代表不同的对象。例如:,struct Student char sex; /* 成员名 */ int age; /* 成员名 */ ; int age; /* 变量名 */ char sex; /* 变量名 */ ,7.1.2定义结构体类型变量及对变量的初始化 定制一个结构体类型后,得到一个结构体类型名。有了这个类型名,就可以像int、char、float和double一样,用来定义一些结构体类型的变量。定义了变量,系统就会为变量分配存储空间。 1. 定义结构体变量 可以采用不同的方法定义一个结构体类型的变量。 (1)在定义了一个结构体类型之后,把变量定义为该类型。如有以下声明:,struct
5、 Student stdnt1, stdnt2, stdnt3;,定义了stdnt1、stdnt2,和stdnt3三个struct Student类型的结构体变量。注意不能写成:,struct Student ,stdnt1, stdnt2, stdnt3; /* 错误逗号 */,Student stdnt1, stdnt2, stdnt3; /* 缺少关键字struct */,struct /* 注意这个头部没有类型名 */ unsigned int num; char name20; char sex; int age; float score; char addr30; stdnt1,
6、stdnt2, stdnt3;,也不能写成:,(2)直接定义结构体类型的变量。如:,此时只是按照花括弧内的结构,直接定义了stdnt1, stdnt2和 stdnt3student三个变量,并没有定义此结构体类型的名字。因 此无法用结构体类型名再定义其它变量。,(3)在声明一个结构体类型的同时定义一个或若干个结构体变量。如:,struct Student unsigned int num; char name20; char sex; int age; float score; char addr30; stdnt1, stdnt2, stdnt3;,它的一般形式为:,struct 结构体名
7、成员声明表列 变量名表列;,这种形式紧凑,既声明了类型,又定义了变量。如果需要再用此struct Student定义其它变量,还可以用:,struct Student stdnt3, stdnt4, stdnt5;,2. 结构体变量的初始化 在定义了结构体变量之后,stdnt1, stdnt2, stdnt3等就具有struct Student结构体类型的特征 ,也有了变量的特征。 例如,stdnt1、stdnt2和stdnt3的值可以有如图7.1所示的值。,struct Student unsigned int num; char name20; char sex; int age; flo
8、at score; char addr30; stdnt1=50201,”ZhangXi”,M,18,90.5,”Shanghai”, stdnt2=50202,”WhangLi”,F,19,88.3,”Beijing”;,也可以用以下形式,Struct Studentstdnt3=50203,”LiHong”,M,17,79.9,”Shanxi”;,struct Student unsigned int num; char name20; char sex; unsigned char age; float score; ; #include int main(void) struct St
9、udent student1=50201,“WangLi”,M,18,89.5; struct Student student2; student2=student1; /* 结构体变量间赋值 */ printf (“student1: %u,%s,%c,%u,%5.2fn”, student1.num, student1.name,student1.sex,student1.age,student1.score); printf (“student2: %u,%s,%c,%u,%5.2fn”, student2.num, student2.name,student2.sex,student2
10、.age,student2.score); return 0; ,运行情况如下:,2. 引用结构体变量的成员 由于一个结构体变量是一个整体,要访问它其中的一个成员,必须先找到这个结构体变量,然后再从中找到它其中的一个成员。例如要访问结构体变量student1中的num,应写成以下形式: student1.num 表达式studen1.num=50201将把50201赋值给结构体变量student1中的成员num。成员运算符的运算级别最高 例如:student.1.num+100,在num两侧有二个运算符,由于成员运算符的运算优先于加号运算符,故相当于: (student1.num)+100,3
11、. 结构体类型数据的输出,printf (“%dn”,student1); scanf(“%d”,printf (%s,%d,%c,%d/%d/%d,%1d,%5.2fn, student1);,printf (%s,%s,%1dn,student1.name, student1.addr,student1.num);,为描述方便,假设有一个简单的结构体类型:,struct char name10; char addr18; unsigned int num; student1=“WangLi”,”12 Beijing Road”,50201;,由于C规定不允许对结构体变量作整体输入输出。如果
12、想输出变量student1的值,应当用语句,printf (%s,%s,%1dn,student1.name, student1.addr,student1.num);,图7.2 student1在内存中的存储,变量student1在内存的存储如图7.2所示。,7.1.4 嵌套结构体类型 在声明一个结构体类型时可以利用已声明了的另一个结构体类型来定义其成员的类型。这称为嵌套结构体类型。 例7.2,struct Date int month; int day; int year; ;/*声明了一个struct Date类型*/ struct Person char name20; /* 姓名 *
13、/ char sex; /* 性别 */ struct Date birthday; /* 出生日期birthday是另一个结构体类型的成员 */ unsigned long num; /* 身份证号*/ ;,这样的定义相当于:,struct Person char name20; /* 姓名 */ char sex; /* 性别 */ int month; int day; int year; unsigned long num; /* 身份证号 */ ;,当使用嵌套结构体类型定义了变量后,对结构体变量成员的操作,应采用逐级访问的方式进行。例如定义两个变量 struct Person zha
14、ng, wang; 后,要访问zhang的出生年份,应当用表达式 zhang.Data.year 下面是一个应用程序:,#include int main (void) struct Person p1=“WangLi“,M,12,15,1974, 111000222; struct Person p2; p2=p1; printf (“zhang:%s,%c,%d-%d-%d,%lun“,p1.name, p1.sex,p1.birthday.month,p1.birthday.day,p1.birthday.year,p1.num); printf (“zhang:%s,%c,%d-%d-
15、%d,%lun“,p2.name, p2.sex,p2.birthday.month,p2.birthday.day,p2.birthday.year,p2.num); ,运行情况如下:,也可以把一个结构体变量中的内嵌结构体类型成员赋给另一个结构体变量的相应部分。如上例中如果有下列语句是合法的: student2. birthday=student1.birthday,7.2 结构体数组,一个结构体变量只能存放一个对象(如一个学生、一个职工)的一组数据。如果要存放一个班(30人)学生的有关数据就要设30个结构体变量,例student1,student2, student30,显然是很不方便的。
16、人们自然想到使用数组,即将同类型的结构体变量用数组进行组织。 7.2.1 结构体数组的定义与初始化 1. 定义结构体数组 图7.5以struct Student 为例,说明定义结构体数组可以采用的三种方法。,struct Student unsigned int num; ; Struct Student stu30;,struct Student unsigned int num; stu30;,struct unsigned int num; stu30;,(a),(b),(c),图7.5 定义结构体数组的三种方法,2. 结构体数组的初始化,struct Student unsigned
17、int num; char name16; char sex; int age; float score; char addr30; ; struct Student stu3=50201,”ZhangXi”,M,18,90.5,”Shanghai”, 50202,”WhangLi”,F,19,88.3,”Beijing”, 50203,”LiHong”,M,17,79.9,”Shanxi”;,定义了一个struct Student类型结构体数组stu,它有3个元素,又定义了一个结构体变量student1,则下面的赋值合法:,struct Student stu3,student1;,7.2.
18、2 对结构体数组元素的操作 1. 结构体数组元素的赋值 一个结构体元素(结构体下标变量)相当于一个结构体变量,可以将一个结构体数组元素赋值给同一结构体类型的数组中另一个元素,或赋给同一类型的变量。如,student1=stu0; stu0=stu1; stu1=student1;,2. 引用结构体数组元素成员 引用结构体数组元素的成员的方法与引用结构体变量成员的方法相同。 例如 stui.num 是引用下标为i的stu数组元素中的num成员。 如果数组已初始化,且i=2,则相当于stu2.num。,#include #include #define StuNUM 3 struct StudTy
19、pe char name16; long num; int age; char sex; float score; ; int main(void) struct StudType stuStuNUM; int i; char ch; char numstr16;,例7.7 输入3个学生的信息并将它们输出。,/* 输入数据 */ for (i=0;iStuNUM;i+) printf (“nenter all data of stu%d:n“,i); gets (stui.name); gets (numstr);stui.num=atol (numstr); gets (numstr);st
20、ui.age=atoi(numstr); stui.sex=getchar(); ch=getchar(); gets (numstr);stui.score=atof(numstr); /* 输出数据 */ printf (“n record name t t numtagetsextscoren“); for (i=0;iStuNUM;i+) printf (“%dt%-16s%-8d%dt%-ct%6.2fn“,i,stui.name, stui.num,stui.age,stui.sex,stui.score); return 0; ,运行情况如下:,7.3 指向结构体的指针,7.3.
21、1 指向结构体变量的指针 1. 指向结构体变量的指针及其定义 可以定义一个指针变量指向一个结构体变量。结构体变量的指针就是这个结构体变量所占内存单元段的起始地址。 如果已经如前定义了一个struct studtype类型,则可用下面形式定义一个指向这一种类型数据的指针变量: struct studtype *p;,2. 使用指向结构体变量的指针引用结构体变量的成员,#include #include struct StudType char name16; long num; int age; char sex; float score; ;,int main(void) struct Stu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用户 定制 数据类型
链接地址:https://www.31doc.com/p-2257729.html