c语言结构体与共同体.ppt

上传人:小飞机 文档编号:6504300 上传时间:2023-11-07 格式:PPT 页数:39 大小:304.99KB
返回 下载 相关 举报
c语言结构体与共同体.ppt_第1页
第1页 / 共39页
c语言结构体与共同体.ppt_第2页
第2页 / 共39页
c语言结构体与共同体.ppt_第3页
第3页 / 共39页
c语言结构体与共同体.ppt_第4页
第4页 / 共39页
c语言结构体与共同体.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《c语言结构体与共同体.ppt》由会员分享,可在线阅读,更多相关《c语言结构体与共同体.ppt(39页珍藏版)》请在三一办公上搜索。

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 BeiJing3、定义方法:方法一:在定义结构体类型的同时,直接给出结构体变量。如:struct 结构体名 结构体成员变量的定义;变量名1,变量名2,.,变量名n;方法二:先给出结构体类型的定义,再定义结构体变量。如:struct 结构体名 结构体成员变量的定义;例:;struct 结构体名 变量名1,变量名2,.,变量名n;

3、4、要点:,方法二:struct student int number;char name20;char sex;int age;float score;char addr30;struct student student1,student2;,方法一:struct student int number;char name20;char sex;int age;float score;char addr30;student1,student2;请注意两种方法的不同特点:1、“;”的用法;2、方法二可以用一个*.h文件来存储结构体的定义。,4、要点:结构体名(struct):用于标识一种新的数据

4、类型,即结构体类型,可以省略。注意区分结构体类型与基本数 据类型的不同,它是复合数据 类型。结构体成员变量与普通变量的 定义一样,它还可以是结构体 变量。,struct dateint month,day,year;struct student int num;char name20;char sex;int age;struct date birthday;char addr30;student1,student2;,结构体变量的存储特点,如:struct student int number;char name5;char sex;int age;float score;char addr

5、10;student1,student2;,struct student所占存储空间的大小为:各成员变量所占存储单元字节数之和。sizeof(student),结构体类型变量的引用,一、原则:通过结构体的成员来引用结构体变量。二、成员的引用方法为:结构体变量名.成员名三、要点:1.结构体变量不能整体输入输出,只能对它的成员进行操作。如:student1.num;2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符,逐级找到最底层的成员。如3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要加上“.”运算符。4.可以引用成员的地址。,结构体变量的初始化,一、只可以给主函数中或外部

6、存储类别和静态存储类别的结构体变量、数组赋初值。1、对外部存储类型的初始化.2、对静态存储类型的结构体变量进行初始化二、给结构体变量赋初值不能跨越前面的成员而只给后面的成员变量赋值。,例exp8_1:对外部存储类型的初始化.#include struct student long number;char name20;char sex;int age;float score;char addr30;a=99641,”Li Ping”,M,56,”Tianjin Street”;main()printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,a.n

7、ame,a.sex,a.addr);,例exp8_2:对静态存储类型的结构体变量进行初始化.#include main()static struct student long number;char name20;char sex;int age;float score;char addr30;a=99641,”Li Ping”,M,56,”Tianjin Street”;printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,a.name,a.sex,a.addr);,结构体数组,结构体数组的含义:数组元素是结构体类型数据的数组称为结构体数组。结构

8、体数组的定义结构体数组的初始化结构体数组的应用举例,结构体数组的定义,一、含义:若干个相同的结构体类型变量组成的数据集合。二、定义方法:struct 结构体名 例如:结构体成员定义;数组名元素个数;三、结构体数组的使用方法1、通过数组的下标(或指向数组的指针)来访问结构体变量。2、再通过结构体变量的成员实现结构体数据的访问。形式为:数组名下标.成员名如:stu2.name=“Wang Ying”;,struct student long number;char name20;char sex;int age;float score;char addr30;struct student stu3

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

10、”Beijing Road”,99441,”Ren Zhong”,M,34,”Shenyang Road”;,结构体数组的初始化,例exp8_3:对候选人得票的统计程序,设有三个候选人,每次输入一个候选人的名字,最后统计出每个候选人的得票的结果.#include struct person char name20;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(le

11、ader_name,leaderj.name)=0)leaderj.count+;printf(“n”);for(i=0;i3;i+)printf(“%5s:%dn”,leaderi.name,laderi.count);,结构体指针,指向结构体变量的指针指向结构体数组的指针指向结构体的指针作函数的参数单链表,指向结构体变量的指针,一、含义:1、结构体变量的指针:指结构体变量所占内存单元的起始地址2、指向结构体变量的指针指向结构体变量的起始地址的指针变量.二、定义方法与使用三、要点:1、必须将指针指向一个确定的结构体变量,如:p=2、通过结构体变量的指针访问结构体的方法为:a.num、(*p)

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

13、-num的不同。,例exp8_4:指向结构体数组的指针#include struct student long number;char name20;char sex;int age;float score;char addr30;a3=070441,”Li Ping”,M,56,”Tianjin Street”,070442,”Zhang Fan”,F,78,”Beijing Road”,070443,”Ren Zhong”,M,34,”Shenyang Road”;main()struct student*p;for(p=a;pnum,p-name,p-sex,p-age,p-score,

14、p-addr);,指向结构体的指针作函数的参数,1、用结构体变量的成员作函数的参数与一般变量作函数的参数一致;2、用指向结构体变量的指针作函数的参数,实参将地址传递给形参,与前面指针作函数参数一致;3、新版本的c语言允许将整个结构体变量作为函数的参数进行传递,要求形参与实参的类型必须一致,而且程序占用内存大,运行速度慢.4、举例(参见课本p227),单链表,一、链表的含义:当一个结构体中有一个成员是指向本结构体的指针时,通过这样的指针可以将若干个相同的结构体存储单元连接成一个新的数据结构。举例:二、功能:可以根据需要动态的开辟存储空间。1.malloc(size):在内存中动态的分配一个长度为

15、size的连续空间;2.calloc(n,size):在内存中分配n个长度为size的连续空间;3.free(ptr):释放由ptr指针指向的内存区域.二、链表操作建立链表、在链表插入结点、删除链表结点,单链表的结构:struct student int num;float score;struct student*next;,要点:1、链表中的元素在内存中存放顺序是不连续的。由next指针来连接各节点。2、链表数据结构的实现,必须利用指针变量.,节点,建立含n个节点的链表过程:,struct student*creat()struct student*head,*p1,*p2;n=0;hea

16、d=NULL;p1=p2=(struct student*)(malloc(sizeof(struct student);scanf(“%ld,%f”,在链表中插入结点的过程,.,删除链表结点的过程:,malloc(),共同体(union),共同体的含义与定义方法共同体的存储特点共同体的使用,共同体的含义与定义方法,一、含义:几个不同变量共同占用同一块内存空间,只是一种覆盖技术,所谓的共同占用是指这几个变量共同拥有内存的同一个起始地址.共用相同的存储单元。二、定义形式:union 共用体名 例如:成员表列;union date 变量表列;int i;char ch;float f;a,b,c;

17、,共同体的存储特点,1.同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种;2.共用体变量中起作用的成员是最后一次存放的成员;3.共用体变量的地址和它的成员的地址是同一个地址;4.共用体变量不能整体被赋值,也不能给共用体变量赋初值;5.不能把共用体变量作为函数的参数进行传递,但可以使用指向共用体变量的指针作为函数的参数;6.结构体类型和共用体类型可以嵌套使用。,例如:union date int i;char ch;float f;a,b,c;,共同体的使用,例exp8_5:已知字符“0”的ASCII马为十六进制的30,下面程序的输出为:main()union unsigned

18、char c;unsigned int i4;z;z.i0=0 x39;z.i1=0 x36;printf(“%cn”,z.c);运行结果:9,例:下列程序的运行结果是什么?#include main()union zj int a;char ch2;au;au.a298;printf(dndn,au.ch0,au.ch1);运行结果为:,42,1,结构体与共用体小结,一、共同点:都是不同类型数据的集合二、不同点:1、结构体中各个成员均在内存中存在,而共同体中只有一个成员存在于内存中。2、结构体占用的存储空间是所有成员所占空间的和;=sizeof(结构体名)而共用体所占内存空间的大小是所有成员

19、中占用存 储空间最大的一个成员的占用空间的值。3、结构体中各个成员相互独立、互不干扰,共同体中改变一个成员的值,会影响到其它成员的值。4、结构体与共同体可以互为成员。,枚举类型,1、含义:“枚举类型”是将变量的取值一一列举出来,变量的取值只限在列出来的取值范围内.2、定义方法:enum weekday sun,mon,tue,wed,thu,fri,sat;enum weekday workday;枚举类型的变量 workday的取值只能在sun-sat之间.3、使用要点:4、应用举例,要点:1.枚举元素在c语言中按常量来处理,不是变量,不能被赋值;2.作为常量的枚举元素,它们是有值的.在编译

20、是按它们的定义顺序取值为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=tue;(),例:编写程序,功能是输入当天是星期几,就可以计算并输出n天后是星期几。例如,今天是星期六,若求3天后是星期几,则输入6,3,即输出“3天后是星

21、期2”。#include enum weeksun,mon,tue,wed,thu,fri,sat;enum week nd(w,n)enum week w;int n;return(enum week)(int)wn)7);main()enum week w0,wn;/*w0表示当天的星期值,wn表示n天后的星期值*/int n;scanf(d,d,w0,n);wnnd(w0,n);if(wn0)printf(d天后是星期日n,n);else printf(d天后是星期dn,wn);,typedef定义类型,一、含义:使用typedef可以说明一个新的类型标识符。二、定义方法:typedef 类型名 标识符三、要点:1、“类型名”为已有定义的类型标识符;“标识符”为用户定义的新标识符2、经typedef说明后的标识符可作为原数据类型名使用四、应用:,typedef struct student int i;.REC;REC x,y,*p;typedef struct int month;int day;int year;DATE;DATE birthday,*p;,typedef struct int _fd;int _cleft;int _mode;char*_nextc;char*_buff;FILE;FILE*fp;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号