C语言程序设计3.ppt_第1页
C语言程序设计3.ppt_第2页
C语言程序设计3.ppt_第3页
C语言程序设计3.ppt_第4页
C语言程序设计3.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第十一章 结构体与共用体,结 构 体,共 用 体,枚 举 类 型,用户自定义类型,结 构 体,定义结构体变量的方法,结 构 体 变 量 的 引 用,结 构 体 变 量 的 初 始 化,结 构 体 数 组,指向结构体数据的指针,用 指 针 处 理 链 表,如: struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student student1,student2;,1、 先定义(声明)结构体类型,再定义变量名,定义结构体类型变量的方法,struct 结构体类型名 成员表列 ; struct 结构体类型名 变量名;,结构体类型名,结构体变量名,说明: (1)结构体变量后,系统会为之分配内存单元,所分配 单元数为各个成员项所需存储单元数的总和。 (2)将一个变量定义为一个标准类型(基本数据类型) 与定义为结构体类型不同在于后者不仅要求指定变 量为结构体类型,而且要求指定为某一特定的结构 体类型(如struct student)。 (3)如果程序规模比较大,往往将对结构体类型的声明 集中放到一个文件(以.h为后缀的“头文件”)中。,2、 在声明类型的同时定义变量,如: struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;,struct 结构体类型名 成员表列 变量名表列;,3、直接定义结构体类型变量,struct 成员表列 变量名表列;,如: struct int num; char name20; char sex; int age; float score; char addr30; student1,student2;,关于结构体类型的几点说明:,(1)类型与变量是不同的概念,对结构体变量来说,在定 义时一般先定义一个结构体类型,然后定义一个变量 为该类型。只能对变量赋值、存取或运算,而不能对 一个类型赋值、存取或运算。在编译时,对类型是不 分配空间的,只对变量分配空间。,(2)对结构体中的成员(即“域”),可以单独使用, 它的作用与地位相当于普通变量。,(4)成员名可以与程序中的其他变量名相同,二者不 代表同一对象。,(3)成员也可以是一个结构体变量。,struct date int month; int day; int year; ;,struct student int num; char name20; char sex; int age; struct date dirthday; char addr30; student1,student2;,结构体变量的引用,1、引用方式为: 结构体变量名成员名 “ . ” 是成员(分量)运算符,它在所有运算符中优先级最高,用于对结构体变量中各个成员项的引用 如已定义student1为结构体变量并且它们已有值,则引用各个成员项: student.sex 注意: 不能将一个结构体变量作为一个整体进行输入和输出,对结构体变量进行引用时,只能对结构体变量中的各个成员分别引用,不能这样引用: printf(“%d,%s,%c,%d,%f,%sn”,student1);,2、 如果成员本身又属于一个结构体类型,则要用若干个 成员运算符,一级一级地找到最低的一级的成员。只 能对最低级的成员进行赋值或存取以及运算。 3、 对成员变量可以像普通变量一样进行各种运算(根据 其类型决定可以进行的运算)。 4、 可以引用成员的地址,也可以引用结构体变量的地址。,结构体变量的初始化,对结构体变量进行初始化。 例如: struct student long int num; char name20; char sex; char addr20; a=89031,“Li Lin”,M,”123 Bejing Road”; main() printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,,a.sex,a.addr); ,结 构 体 数 组,1、 一个结构体变量中可以存放一组结构体类型的数据,就是结构体数组。 2、 结构体数组中每个数组元素都是一个结构体类型的数据,它们都分别有各自的各个成员(分量)项。 3、 结构体数组的定义和定义结构体变量的方法相仿,只需说明其为数组即可。,struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu3; 数组各元数在内存中连续存放,结 构 体 数 组 的 定 义,struct student int num; char name20; char sex; int age; float score; char addr30; stu3=10101,”Li Lin”,M,18,87.5,“103 Bejing Road”,10102,”Zhang Fun”,M,19,99”130 Shanghai Road”,10104,”WangMin”,F,20,78.5,”1010 Zhongshan Road”;,结 构 体 数 组 的 初 始 化,各元素在内存中连续存放 情况示意图见教材P287图11.5,说明: 定义数组stu时,元素个数可以不指定,写成以下形式: stu =,; 编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。 结构体数组初始化的一般形式是在定义组的后面加上:=初值表列;,结构体数组应用举例 P287 11.2,指向结构体类型数据的指针,指向结构体变量的指针变量 #include ”string.h” main() struct student long int num; char name20; char sex; float score; ; struct student stu_1; struct student *p; p= ,( *p ).num ( *p ).name ( *p ).sex ( *p ).score,p-num p-name p-sex p-score,说明: 对结构体数组中某个元素中的各个成员项 以下三种形式等价: (1) 结构体变量.成员名; (2)(*p).成员名; (3)p-成员名,指向结构体数组元素的指针,如: struct student int num; char name20; int age; ; char sex; struct student stu3= 10101,”Li Lin”,M,18,10102,”Zhang Fun”,M,19,10104,”WangMin”,F,20; main() struct student *p; printf(“No. Name sex agen”); for (p=stu; pnum,p-name,p-sex, p-age); ,将一个结构体变量的值传给另一个函数的两个方法: 1 用结构体变量的成员作参数。 2 用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,用结构体变量和指向结构体的指针作函数参数,说明: 把一个完整的结构体变量作为参数传递,虽然合法,但 要将全部成员值一个一个传递,费时间又费空间,开销大, 如果结构体类型中的成员很多,或有一些成员是数组,则程 序运行效率会大大降低。在这种情况下,用指针作函数参数 比较好,能提高运行效率。,例题 11.5 11.6 P292 P293,用 指 针 处 理 链 表,1 链表是一种常见的重要的数据结构,是动态地进行存储 分配的一种结构。 2 链表根据需要开辟内存单元,不会浪费内存。 3 链表有一个“头指针”变量,存放一个地址,该地址指向 一个元素。链表中每一个元素称为“结点”,每个结点都 应包括两个部分:用户需要的实际数据和下一个结点的 地址。 4 链表中各元素在内存中可以不是连续存放的。 5 链表的数据结构必须利用指针变量才能实现。,链表中的各个元素称为结点 链表的实现需要指针和结构体变量 链表的特点是: (1)头指针变量head指向链表的首结点。 (2)每个结点由2个域组成: 1)数据域存储结点本身的信息。 2)指针域指向后继结点的指针。 (3)尾结点的指针域置为“NULL(空)”,作为链表结束的标志。,结点的结构可以如下定义 struct student int num; float score; struct student *next; ,建立和输出一个简单的链表的程序可以如下: 例 11.7 P295,#define NULL 0 struct student long num; float score; struct student *next; ; main() struct student a,b,c,*head,*p; a.num=99101; a.score=89.5; b.num=99103; b.score=90; c.num=99107; c.score=85; head= ,C语言提供的三种动态开辟和释放存储单元的库函数: 1、 Malloc(size) 在内存的动态存储区中分配一个 长度为size的连续空间。 2、 Calloc(n,size) 在内存的动态区存储中分配n 个长度为size的连续空间。 3、 Free(ptr) 释放由ptr指向的内存区。,注意:ANSI标准要求动态分配系统返回void指针。所以 在使用的时候要注意,需要用强制类型转换的方法把void 指针换成所需要的类型。,例如: 有以下程序 #include main() char *p,*q; p=(char *)malloc(sizeof(char)*20); q=p; scanf(“%s%s“,p,q); printf(“%s%sn“,p,q); 若从键盘输入:abc def,则输出结果是_。 A) def def B) abc def C) abc d D) d d,1、建立动态链表 例11.8 写一函数建立一个有3名学生数据的单向动态链表。 算法:,2、输出链表 例11.9 编写一个输出链表的函数print。 算法:,3、对链表的删除操作 例11.10 写一函数以删除动态链表中指定的结点。 算法:,4、对链表的插入操作 例11.11 写一函数在动态链表中插入一个结点。 算法:,“共用体”类型变量的定义形式为: union 共用体名 成员表列 变量表列;,共 用 体,概念 将几种不同类型的变量存放到同一段内存单元中,使用覆盖技术,几个变量互相覆盖,种是几个不同的变量共占同一段内存的结构,称为“共用体“类型的结构。,共用体类型名,例 11.12 P311 共用体类型数据的运用,例如,定义data共用类型变量un1,un2,un3的语句如下:,union data int i; char ch; float f; un1, un2, un3;,或者: union data int i; char ch; float f; ; union data un1,un2,un3;,共用变量占用的内存空间,等于最长成员的长度,而不是各成员长度之和。 例如,共用变量un1、un2和un3,在16位操作系统中,占用的内存空间均为字节(不是2+1+4=7字节),共用变量的引用与结构变量一样,也只能逐个引用共用变量的成员 例如,访问共用变量un1各成员的格式为:un1.i、un1.ch、un1.f。,共用体类型数据的特点: 1、同一个内存可以存放几种不同类型的成员,但在每一瞬 时只能存放其中一种,而不是同时存放几种。 2、共用体变量中起作用的成员是最后一次存放的成员,在 存入一个新的成员后原有的成员就失去作用。 例如:若有以下赋值 un1.i=1; un1.ch=a; un1.f=1.5; 则最后只有un1.f有效。,共 用 体 变 量 的 引 用 方 式,引用时应注意: 1、先定义了共用体变量才能引用它。 2、不能只引用共用体变量,必须引用共用体变量中的成员。,3、共用体变量的地址和它的各成员的地址都是同一地址。 4、不能对共用体变量名赋值,也不能企图引用变量名来 得到成员的值,又不能在定义共用体变量时对它初始 化。 5、不能把共用体变量作为函数参数,也不能使函数带回 共用体变量,但可以使用指向共用体变量的指针(与 结构体变量这种用法相仿)。 6、共用体类型可以出现在结构体类型定义中,也可以定 义共用体数组。反之,结构体也可以出现在共用体类 型定义中,数组也可以作为共用体的成员。,枚 举 类 型,定义枚举类型用enum开头: enum weekdaysun,mon,tue,wed,thu,fri,sat; enum weekday workday, week_end;,枚举类型,枚举类型变量,说明: 1、“枚举类型”是指将变量的值一 一列举出来,变量的 值只限于列举出来的值的范围内; workday=mon; week_end=sun; 2、在C编译中,对枚举元素按常量处理,故称枚举常量, 不能另外对它们赋值;,2、枚举元素作为常量,它们是有值的,C语言编译按定 义时的顺序使它们的值为0,1,2; 如: printf( “%d”, workday ); /* 输出结果为1 */ 枚举元素的值也可以有程序员指定,如: enum weekday=sun=7,mon=1,tue,wed,thu,fri,sat; 此时,tue的值为2,wed的值为3,sat的值为6,3、枚举值可以用来做判断比较; 如:if( workday= =mon ) if( workdaysun ) 4、一个整数不能直接赋给一个枚举变量 如:workday=2; 是错误的; 应先进行强制类型转换, workday=( enum weekday )2;,例 11.13 P313 枚举类型数据的运用,用 typedef 定 义 类 型,说明: 1、用typedef可以定义各种类型名,但不能用来定义变量。用 typedef可以声明数组类型、字符串的类型,使用比较方便。 2、用typedef只是对已经存在的类型增加一个类型名,而没有 创造新的类型。,除了可以直接使用C提供的标准类型名(如int,char, float,double,long等)和自己声明的结构体、共用 体、指针、枚举类型外,还可以用typedef定义新的 类型名来代替已有的类型名。 例如: typedef int INTERGER;,3、typedef与#define有相似之处,但事实上不同。

温馨提示

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

评论

0/150

提交评论