版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本章重点 14.1 用typedef说明一种新类型名 14.2 结构体类型 14.3 共用体,第14章 结构体、共用体和用户自定义类型,14.1 用typedef说明一种新类型名 语言允许用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能,它可以语言的基本数据类型取“别名”,也可以为用户自定义的结构类型取“别名”。例如, typedef int INTEGER 这以后就可用INTEGER来代替int作整型变量的类型说明了。例如: INTEGER a,b; 它等效于: int a,b;,用typedef定义数组类型、指针类型、结构类型将带来
2、很大的方便,不仅使程序书写简洁,而且增强了可读性。例如: typedef char NAME20; 表示NAME是字符数组类型,数组长度为20。然后可用NAME 说明变量,如: NAME a1,a2,s1,s2; 完全等效于: char a120,a220,s120,s220,typedef struct stu char name20; int age; char sex; Student; 定义Student表示struct stu的结构类型,然后可用Student来说明结构变量: Student body1,body2;,typedef定义的一般形式为: typedef 原类型名 新类型
3、名 有时也可用宏定义(#define)来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,它并不只是作简单的字符替换。,14.2 结构体类型,C语言的基本数据类型有整型,实型,字符型等,在实际问题中,把一个对象抽象成数据来表示时,往往需要一组不同基本数据类型的组合。,14.2.1 结构体类型的说明 结构体类型说明的一般形式是: struct 结构体标识名 类型名1 结构成员名表1; 类型名2 结构成员名表2; 类型名n 结构成员名表n; ;,其中struct是关键字,是结构体类型的标志。“结构体标识名”和“结构成员名”都是用户定义的标识符。其中“结构体标
4、识名”是可选项,在说明中可以不出现。成员表列由若干个成员组成,由一对大括号括起来,每个成员都是该结构的一个组成部分。对每个成员也必须作类型声明,其形式如下: 类型说明符 成员名; 结构体成员名表中可以含有多个同类型的成员名,它们之间用逗号分隔。例如: struct student int math score, ;english score, sum; 结构体中的成员名可以和程序中的其它变量同名;不同结构体中的成员也可以同名。,在成员列表中,类型名1类型名n不仅可以是简单数据类型,也可以是构造类型,所以也可以是某种结构体类型。这时称为结构体的嵌套。嵌套时允许内嵌结构体成员名与外层成员的名字相同
5、。例如: struct student char name10; char sex; struct date birthday; float score5; ;,以上说明中,birthday成员的类型struct date是一个已经说明过的结构体类型。若事先没有说明这一类型,则以上结构体类型说明可改写成如下: struct student char name10; char sex; struct int year; int month; int day; birthday; float score5; ;,14.2.2 结构体类型的变量的定义 定义结构类型变量由以下四种方法: 1先定义结构,
6、再说明结构变量。例如: struct student int number; char name31; short age; char sex; char grade; char address101; ; struct student boy1, boy2;,2在定义结构类型的同时说明结构变量。这种形式说明的一般形式为: struct 结构名 成员表列 变量名表列; 例如: struct student int number; char name31; short age; char sex; char grade; char address101; boy1, boy2;,3直接说明结构变
7、量。即在结构变量定义中省去了结构类型名,而直接给出结构变量。一般形式为: struct 成员表列 变量名表列; 例如以上结构中把student省略, struct student boy1, boy2;,4使用typedef说明一个结构体类型名,再用新类型名来定义变量。例如: typedef struct char ame2; char sex; struct date birthday; float sc4; STREC; STREC boy1, boy2; 此处STREC是一个具体的结构体类型名,它能够唯一的标识这种结构体类型。因此,可用它来定义变量,不可再写关键字struct。,14.2
8、.3 结构体类型的变量的引用 表示结构变量成员的一般形式是: 结构变量名.成员名 例如: boy1. number 即boy1的学号 boy2. name 即boy2的名字 结构变量的成员,与相同类型的普通变量并无区别,可以像普通变量一样参与各种运算,这根据其类型决定。例如: boy1.number = ;,相同类型的结构体变量之间还可以进行整体引用赋值,例如: struct char name10; int num; per1, per2=“WUTING”, 23; 执行赋值语句:per1=per2;后,per2中每个成员变量的值都赋给了per1中对应的同名成员。这种赋值方
9、式很简洁,但必须保证赋值号两边的结构体变量类型相同。,14.2.4 结构体类型变量的赋值和初始化 结构变量的赋值就是给各结构成员赋值。可用输入语句或赋值语句来完成。例如: #include stdio.h int main(void) struct Student int number; char name31; short age; char sex; char grade; boy1, boy2;,boy1.number = 1461; printf(input name:); scanf(%s, ); printf(input age:); scanf(%d, ,程序运
10、行时输入: input name:zhang input age:12,和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。 #include stdio.h int main(void) struct Student int number; char name31; short age; char sex; char grade; boy2, boy1 = 1461, zhang, 12, m, 5; boy2=boy1; return 0;,14.2.5 结构体类型数组 定义结构体数组的方法和结构变量相似,只需说明它为数组类型即可。例如: struct student int num
11、ber; char name31; short age; char sex; char grade; student50;,在定义结构体数组时,对其作初始化赋值,可不指定数组的长度,此时数组长度等于赋值项数。由于数组中的每个元素都是一个结构体,所以通常将其成员的值依次放在一对大括号中,以便区分各个元素。例如: struct bookcard char num5; float money; bk3= “NO.1”, 32.5, “NO.2”, 40.0, “NO.3”, 65.5 ; 给二维数组的赋值规则同上,14.2.6 结构体指针变量 1结构变量的指针 一个指针变量当用来指向一个结构变量时,
12、称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。有了结构指针,就可通过结构指针来访问结构变量或结构变量成员,这与通过数组指针来访问数组或数组元素是相同的。 结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名 结构指针变量也必须要先赋值后才能使用。赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。,有了结构指针变量,就能更方便地访问结构变量的各个成员。 其访问的一般形式为: (*结构指针变量).成员名 或 结构指针变量-成员名 例如: (*ps).number 或 ps-number 一个结构指针变量虽然可以用来访问结构变量,但是,不能使它
13、指向一个成员。也就是说不允许取一个成员的地址来赋予它。,2结构数组的指针 设pt指向的结构变量 pt-number pt指向的结构变量的成员的number的值 pt-number+ pt指向的结构变量的成员的number的值,使用后加1 +pt-number pt指向的结构变量的成员的number先加1,再使用,设pt指向的结构数组 (pt+)-number 先使pt指向下一数组元素,得到其number的值 pt+-number 等同于(pt+)-number (+pt)-number 得到pt当前指向数组元素的number值,后使pt指向下一元素 3结构指针变量作为函数参数 把一个结构变量的
14、值传递到另一个函数,有3种方式: (1)传递结构成员。 (2)传递结构变量。 (3)传递结构指针。,14.2.7 链表 使用数组存放数据,必须事先定义好数组的长度。但数组元素的插入和删除会引起大量数据的移动,从而使简单的数据处理变得非常低效。为了能有效地解决这些问题,一种称为链表的结构类型得到了广泛的应用。 链表是一种动态数据结构,它的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。链表中每一个元素称为结点,每一个结点都是由数据域和指针域组成的。每个结点中的指针域,包含一个指针,指向下一个结点;也可以多个指针指(如双向链表)。,链表有一个头结点,表示链表中的第一个元素
15、,它的指针指向第二个结点。第二个结点的指针指向第三个结点,如此往复,直到最后一个元素,这就是链表的尾结点,它的指针存放的是空值(NULL指针)。 1静态链表 静态链表的节点是在程序中事先定义好的,不是在运行时动态分配的,故称静态链表。例如以下静态链表的创建和输出。,2动态链表的创建和删除 动态链表的创建是指在程序执行时,建立起一个一个节点,并将它们连接成一串,形成一个链表。 动态链表不再是用时,应及时的删除,以释放动态链表占用的内存。,14.3 共用体,共用体的类型说明和变量的定义方式与结构体的类型说明和变量定义方式完全相同,不同的是共用体变量中的所有成员占有同一个存储空间。 14.3.1 共
16、用体类型的说明和变量定义 1共用体类型说明 共用体类型说明的一般形式为: union 共用体标识名 类型名1 共用体成员名1; 类型名2 共用体成员名2; 类型名n 共用体成员名n; ;,说明:union为关键字,是共用体类型的标志。共用体表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量。在内存单元中,所有成员具有相同的首地址,并且重叠在一起。共用体中的成员可以是简单变量,也可以是数组、指针、结构体和共用体。,2共用体变量的定义 用已说明的共用体类型来定义共用体变量。和定义结构体变量类似,可以采用以下几种方式:先定义共用体类型再定义变量;定义共用体类型的同时定义变
17、量;直接定义共用体变量。例如,有一共用体类型定义如下: union cif_ty char c; int i; float f; ;,用已说明的共用体类型来定义共用体变量。即用上面说明的共用体类型cif_ty定义一个名为cif的共用体变量, 可写成: union cif_ty cif; 也可以在定义共用体类型的同时定义共用体变量。例: union cif_ty char c; int i; float f; cif;,还可以直接定义共用体变量。例: union char c; int i; float f; cif; 在共用体变量cif中, 字符变量c,整型变量i,和浮点变量f公用同一内存位置
18、。当一个共用体变量被定义时, 编译程序将按照共用体变量中最大的成员长度分配一块内存。,同样也可以定义共用体数组变量或共用体指针变量,例: union cif_ty ug3; union cif_ty *up=ug; 当定义共用体指针时, 也要用-符号, 来访问共用体成员,可表示成: 共用体变量名-成员名 另外, 共用体类型和结构类型可以互相嵌套,共用体类型可以出现在结构体类型的定义中;结构体类型也可以出现在共用体类型的定义中。,14.3.2 共用体变量的引用 1共用体变量中成员的引用 可以使用以下三种形式引用共用体变量中的成员: (1)共用体变量名.成员名 (2)指针变量名成员名 (3)(*指针变量名).成员名,例如,对前一小节定义得共用体变量cif,如下引用其个成员: cif.c 引用char型成员c cif.i 引用int型成员i cif.f 引用float型成员f 共用体中的成员变量可参与其所属类型允许的任何操作。但在访问共用体成员时应注意,共用体变量中起作用的是最近一次存入的成员变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 同步优化设计2024年高中数学第一章直线与圆1.4两条直线的平行与垂直课后篇巩固提升含解析北师大版选择性必修第一册
- 专题11 课外阅读(讲义+试题) -2023年三升四语文暑假衔接课(统编版)
- 2024贷款购销合同范本范文
- 2024养猪场转让合同(参考文本)
- 草药基地合同范本(2篇)
- 2022年监理合同(2篇)
- 关于试用期工作总结
- 顽固皮肤病康复经验分享
- 国际会展中心建设总承包合同
- 跨境电商快递租赁合同
- 植物盆栽课件教学课件
- 《复活》精制课件
- 2023年四川绵阳科技城新区下属国有企业科服公司招聘笔试真题
- 2024年中小学天文知识竞赛初赛试卷
- 2024年10月时政100题(附答案)
- 前程无忧行测笔试题库
- 2024春期国开电大法学本科《国际法》在线形考(形考任务1至5)试题及答案
- 冷却塔技术规格书
- 黑布林-Peter-Pan-中英双语阅读
- 杨柳煤矿“三量”动态变化情况分析报告(3)
- 因式分解经典题型(含详细答案)
评论
0/150
提交评论