结构体与共用体.ppt_第1页
结构体与共用体.ppt_第2页
结构体与共用体.ppt_第3页
结构体与共用体.ppt_第4页
结构体与共用体.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、第八章 结构体与共用体,【教学要求】 1理解结构体的含义。 2掌握结构体类型变量的定义方法。 3掌握结构体类型变量的引用方法。 4掌握结构体类型变量如何在定义的同时初始化。 5理解共同体的含义,掌握共同体类型变量的定义方法。 6. 了解结构体数组的定义和数组元素的引用。 7了解指向结构体类型数据的指针的概念及使用。 8了解链表结点的结构形式,链表的基本操作。 9了解枚举类型的定义,及枚举类型的输入输出。 10了解TYPEDEF的作用。,第八章 结构体与共用体,结构体(struct) 共同体(union) 结构体与共用体小结 枚举类型(enum) typedef定义类型,结构体(struct),

2、结构体的概念 结构体数组 结构体指针,结构体的概念,结构体的定义 结构体变量的存储特点 结构体变量的引用 结构体的初始化,结构体的定义,1、含义:不同类型数据的集合。 2、功能:用于描述一个“概念”。(或记录) 如:num name sex age score addr 10010 LiFun M 18 87.5 BeiJing 3、定义方法: 方法一:在定义结构体类型的同时,直接给出结构体变量。 如: struct 结构体名 结构体成员变量的定义; 变量名1,变量名2,.,变量名n; 方法二:先给出结构体类型的定义,再定义结构体变量。 如: struct 结构体名 结构体成员变量的定义; 例

3、: ; struct 结构体名 变量名1,变量名2,.,变量名n; 4、要点:,方法二: struct student int number; char name20; char sex; int age; float score; char addr30; ; struct studentstudent1,student2;,方法一: struct student int number; char name20; char sex; int age; float score; char addr30; student1,student2; 请注意两种方法的不同特点: 1、“;”的用法; 2、

4、方法二可以用一个*.h文件来存储结构体的定义。,4、要点: 结构体名(struct): 用于标识一种新的数据类型, 即结构体类型,可以省略。 注意区分结构体类型与基本数 据类型的不同,它是复合数据 类型。 结构体成员变量与普通变量的 定义一样,它还可以是结构体 变量。,struct date int month,day,year; struct student int num; char name20; char sex; int age; struct date birthday; char addr30; student1,student2;,结构体变量的存储特点,如: struct st

5、udent int number; char name5; char sex; int age; float score; char addr10; student1,student2;,struct student所占存储空间的大小为: 各成员变量所占存储单元字节数之和。sizeof(student),结构体类型变量的引用,一、原则:通过结构体的成员来引用结构体变量。 二、成员的引用方法为:结构体变量名.成员名 三、要点: 1.结构体变量不能整体输入输出,只能对它的成员进行操作. 如:student1.num; 2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符,逐级找到最底层的成

6、员. 如:student1.birthday.day 3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要加上“.”运算符. 4.可以引用成员的地址.,结构体变量的初始化,一、只可以给主函数中或外部存储类别和静态存储类别的结构体变量、数组赋初值。 1、对外部存储类型的初始化. 2、对静态存储类型的结构体变量进行初始化 二、给结构体变量赋初值不能跨越前面的成员而只给后面的成员变量赋值。,例exp8_1:对外部存储类型的初始化. struct student long number; char name20; char sex; int age; float score; char add

7、r30; a=99641,”Li Ping”,M,”56 Tianjin Street”; main() printf(“No.:%ldnname:%snsex:%cnaddress:%sn”, a.num,,a.sex,a.addr); ,例exp8_2:对静态存储类型的结构体变量进行初始化. main() static struct student long number; char name20; char sex; int age; float score; char addr30; a=99641,”Li Ping”,M,”56 Tianjin Street”; prin

8、tf(“No.:%ldnname:%snsex:%cnaddress:%sn”, a.num,,a.sex,a.addr); ,结构体数组,结构体数组的含义: 数组元素是结构体类型数据的数组称为结构体数组. 结构体数组的定义 结构体数组的初始化 结构体数组的应用举例,结构体数组的定义,一、含义:若干个相同的结构体类型变量组成的数据集合。 二、定义方法: struct 结构体名 例如: 结构体成员定义; 数组名元素个数; 三、结构体数组的使用方法 1、通过数组的下标(或指向数组的指针)来访问结构体变量。 2、再通过结构体变量的成员实现结构体数据的访问。 形式为:数组名下标.成员名 如

9、:=“Wang Ying”;,struct student long number; char name20; char sex; int age; float score; char addr30; struct student stu3;,struct student long number; char name20; char sex; int age; float score; char addr30; stu3; 结构体数组的物理含义: 表示实体(或记录)的个数。,1、含义:在定义结构体数组时完成数组元素的赋值 2、方法:与一般数组元素赋初值的方法相同。 struc

10、t student long number; char name20; char sex; int age; float score; char addr30; a3=99641,”Li Ping”,M,”56 Tianjin Street”, 99341,”Zhang Fan”,”F”,78 Beijing Road”, 99441,”Ren Zhong”,”M”,34 Shenyang Road”;,结构体数组的初始化,例exp8_3: 对候选人得票的统计程序,设有三个候选人,每次输入一个候选人的名字,最后统计出每个候选人的得票的结果. struct person char name20;

11、int count; leader3=“Li”,0,”Zhang”,0,”Fun”,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; printf(“n”); for(i=0;i3;i+) printf(“%5s:%dn”,,laderi.count);,结构体指针,指向结构体变量的指针 指向结构体数组的指针 指向结构体的

12、指针作函数的参数 单链表,指向结构体变量的指针,一、含义: 1、结构体变量的指针: 指结构体变量所占内存单元的起始地址 2、指向结构体变量的指针 指向结构体变量的起始地址的指针变量. 二、定义方法与使用 三、要点: 1、必须将指针指向一个确定的结构体变量,如:p= 2、通过结构体变量的指针访问结构体的方法为: a.num、(*p).num、p-num。 3、区分下面的两种用法: p-n+ 和 +p-n,1、结构体指针的定义: main() struct student long number; char name20; char sex; int age; float score; char

13、addr30; a=99641,”Li Ping”,M,”56 Tianjin Street”,*p=,指向结构体数组的指针,1、定义方法举例: 2、使用要点: 1.p+:是指针p指向数组的下个元素,而这个元素是由结构体类型数据组成的,它不是一个简单的变量. 2.(+p)-num:先使指针p指向结构体数组当前位置的下一个元素,再访问其元素成员num; 请区别与(p+)-num的不同。,例exp8_4:指向结构体数组的指针 struct student long number;char name20; char sex;int age; float score; char addr30; a3=

14、99641,”Li Ping”,M,”56 Tianjin Street”, 99341,”Zhang Fan”,”F”,78 Beijing Road”, 99441,”Ren Zhong”,”M”,34 Shenyang Road”; main() struct student *p; for(p=a;pnum,p-name,p-sex,p-age,p-score,p-addr); ,指向结构体的指针作函数的参数,1、用结构体变量的成员作函数的参数与一般变量作函数的参数一致; 2、用指向结构体变量的指针作函数的参数,实参将地址传递给形参,与前面指针作函数参数一致; 3、新版本的c语言允许将

15、整个结构体变量作为函数的参数进行传递,要求形参与实参的类型必须一致,而且程序占用内存大,运行速度慢. 4、举例(参见课本p227),单链表,一、链表的含义: 当一个结构体中有一个成员是指向本结构体的指针时,通过这样的指针可以将若干个相同的结构体存储单元连接成一个新的数据结构。举例: 二、功能:可以根据需要动态的开辟存储空间。 1.malloc(size):在内存中动态的分配一个长度为size的连续空间; 2.calloc(n,size):在内存中分配n个长度为size的连续空间; 3.free(ptr):释放由ptr指针指向的内存区域. 二、链表操作 建立链表、在链表插入结点、删除链表结点,单

16、链表的结构: struct student int num; float score; struct student *next; ;,要点: 1、链表中的元素在内存中存放顺序是不连续的。 由next指针来连接各节点。 2、链表数据结构的实现,必须利用指针变量.,节点,建立含n个节点的链表过程:,struct student *creat( ) struct student *head,*p1,*p2; n=0;head=NULL; p1=p2=(struct student *)(malloc(sizeof(struct student); scanf(“%ld,%f”,在链表中插入结点的过

17、程,.,删除链表结点的过程:,malloc(),共同体(union),共同体的含义与定义方法 共同体的存储特点 共同体的使用,共同体的含义与定义方法,一、含义: 几个不同变量共同占用同一块内存空间,只是一种覆盖技术,所谓的共同占用是指这几个变量共同拥有内存的同一个起始地址. 共用相同的存储单元。 二、定义形式: union 共用体名 例如: 成员表列; union date 变量表列; int i; char ch; float f;a,b,c;,共同体的存储特点,1.同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种; 2.共用体变量中起作用的成员是最后一次存放的成员; 3.共

18、用体变量的地址和它的成员的地址是同一个地址; 4.共用体变量不能整体被赋值,也不能给共用体变量赋初值; 5.不能把共用体变量作为函数的参数进行传递,但可以使用指向共用体变量的指针作为函数的参数; 6.结构体类型和共用体类型可以嵌套使用.,例如: union date int i; char ch; float f;a,b,c;,共同体的使用,例exp8_5:已知字符“0”的ASCII马为十六进制的30,下面程序的输出为: main() union 运行结果:9 unsigned char c; unsigned int i4; z; z.i0=0 x39; z.i1=0 x36; printf

19、(“%cn”,z.c);,例:下列程序的运行结果是什么? main() union zj int a; char ch2; au; au.a298; printf(dndn,au.ch0,au.ch1); 运行结果为:42,1,结构体与共用体小结,一、共同点: 都是不同类型数据的集合 二、不同点: 1、结构体中各个成员均在内存中存在, 而共同体中只有一个成员存在于内存中。 2、结构体占用的存储空间是所有成员所占空间的和; =sizeof(结构体名) 而共用体所占内存空间的大小是所有成员中占用存 储空间最大的一个成员的占用空间的值。 3、结构体中各个成员相互独立、互不干扰, 共同体中改变一个成员

20、的值,会影响到其它成员的值。 4、结构体与共同体可以互为成员。,枚举类型,1、含义: “枚举类型”是将变量的取值一一列举出来,变量的取值只限在列出来的取值范围内. 2、定义方法: enum weekday sun,mon,tue,wed,thu,fri,sat; enum weekday workday; 枚举类型的变量 workday的取值只能在sun-sat之间. 3、使用要点: 4、应用举例,要点: 1.枚举元素在c语言中按常量来处理,不是变量,不能被赋值; 2.作为常量的枚举元素,它们是有值的.在编译是按它们的定义顺序取值为0,1,2,3 也可以在定义类型时人为定义枚举元素的值,如 enum weekday sun=7,mon=1,tue,wed,thu,fri,sat; enum weekday workday; 3.枚举值可以用来做条件判断,如: if (workday=mon) if (workdaytue) 4.一个整数不能直接赋值给一个枚举变量,如: workday=2;() workday=(enum weekday) 2; () workday=

温馨提示

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

评论

0/150

提交评论