第6章结构体与共用体.ppt
《第6章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《第6章结构体与共用体.ppt(99页珍藏版)》请在三一办公上搜索。
1、1,第6章 结构体与共用体,C/C+语言程序设计,主讲教师:贾澎涛,2023/9/5,2,第6章 结构体与共用体,6.1 结构体6.2 共用体6.3 枚举类型与类型命名,2023/9/5,3,一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。如何描述这些类型不同的相关数据?,6.1 结构体,6.1.1 结构体与结构体类型的定义,?,信息管理,结构体一种构造类型数据 结构体由若干不同类型的数据项组成,构成结构体的各个数据项称为结构体成员。,2023/9/5,4,struct 结构体名 数据类型1 成员名1;数据类型2 成
2、员名2;数据类型n 成员名n;,6.1 结构体,6.1.1 结构体与结构体类型的定义,结构体类型定义的一般形式:,struct为关键字;结构体名是用户定义的类型标识。中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据类型。,2023/9/5,5,例如图书类型的定义:struct bookcard char num10;/*图书分类编号是字符数组类型*/char name30;/*书名是字符数组类型*/char author30;/*作者是字符数组类型*/char publisher60;/*出版社是字符数组类型*/float price;/*价格是单精度实型*/int n;/*
3、库存量是整型*/;,例如学生类型的定义:struct student char num8;/*学号是字符数组类型*/char name30;/*姓名是字符数组类型*/char sex;/*性别是字符型*/int age;/*年龄是整型*/char addr60;/*住址是字符数组类型*/int score6;/*成绩是整型数组类型*/;,6.1 结构体,6.1.1 结构体与结构体类型的定义,2023/9/5,6,6.1 结构体,6.1.2 结构体变量的定义与初始化,1.结构体类型变量的定义,利用已定义的结构体类型名定义变量 struct 结构体名 变量名表;例如:struct bookcard
4、 book1100;struct student s30,t1,t2;,按照结构体类型的组成,系统为定义的结构体变量分配内存单元。结构体变量的各个成员在内存中占用连续存储区域,结构体变量所占内存大小为结构体中每个成员所占用内存的长度之和。,2023/9/5,7,6.1 结构体,结构体类型与变量的说明,类型与变量是不同的概念。应先定义一个结构体类型,而后再定义结构体变量。系统对类型不分配空间,仅对变量分配空间。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。,成员也可以是结构变量。,对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员名可与程序中的变量名相同时,也可与不
5、同结构体类型的成员名相同,二者代表不同的对象。,struct date int year,month,day;struct student char num8;char name30;char sex;struct date birthday;/*成员为结构体类型*/char addr60;int score6;,2023/9/5,8,6.1 结构体,6.1.2 结构体变量的定义与初始化,1.结构体类型变量的定义,在定义结构体类型的同时定义变量,例如:struct student char num8,name20,sex;int age;float score;st30;,struct 结构体
6、名 成员定义表;变量名表;,2023/9/5,9,6.1 结构体,6.1.2 结构体变量的定义与初始化,1.结构体类型变量的定义,直接定义结构体类型变量,例如:struct char num8,name20,sex;int age;float score;st30,a,b,c;,struct 成员定义表;变量名表;,2023/9/5,10,6.1 结构体,6.1.2 结构体变量的定义与初始化,2.结构体变量的初始化,【例6.4】结构体变量的初始化。struct date int year,month,day;struct student char num8,name20,sex;struct
7、date birthday;float score;a=9606011,Li ming,M,1977,12,9,83,b=9608025,Zhang liming,F,1978,5,10,87,c;,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以0值。如果初值个数多于结构体成员个数,则编译出错。,2023/9/5,11,6.1 结构体,6.1.2 结构体变量的定义与初始化,2.结构体变量的初始化,【例6.5】结构体数组的初始化。struct s char num8,name20,sex;float score;stu3=9606011,Li ming,M,87.5,9606012,Z
8、hang jiangguo,M,79,9606013,Wang ping,F,90;,元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数,2023/9/5,12,6.1 结构体,6.1.2 结构体变量的定义与初始化,3.结构体变量的运算,用sizeof运算符计算结构体变量所占内存空间,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,sizeof(a)的结果为8+20+1+6+4=39 sizeof(struct stude
9、nt)的结果为39,2023/9/5,13,6.1 结构体,6.1.2 结构体变量的定义与初始化,3.结构体变量的运算,同类型结构体变量之间的赋值运算,结构体变量之间进行赋值时,系统将按成员一一对应赋值。,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a=9606011,Li ming,M,1977,12,9,83,b,c;c=a;,2023/9/5,14,6.1 结构体,6.1.2 结构体变量的定义与初始化,3.结构体变量的运算,对结构体变
10、量进行取址运算,struct date int year,month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,对结构体变量a进行&a 运算,可以得到a的首地址,它是结构体类型指针。,2023/9/5,15,6.1 结构体,6.1.2 结构体变量的定义与初始化,4.结构体变量成员的引用,结构体变量成员引用的一般形式:结构体变量名.成员名,结构体变量a的各成员可分别表示为a.num、a.name、a.sex、a.birthday、a.score,struct date int year,
11、month,day;struct student char num8,name20,sex;struct date birthday;float score;a;,“.”是分量运算符,运算级别最高。,a.birthday.yeara.birthday.montha.birthday.day,结构体变量的各个成员可进行何种运算,由该成员的数据类型决定,2023/9/5,16,6.1 结构体,6.1.2 结构体变量的定义与初始化,【例6.6】编写一个统计选票的程序。struct candidate char name20;/*name为候选人姓名*/int count;/*count为候选人得票数
12、*/list=invalid,0,Zhao,0,Qian,0,Sun,0,Li,0,Zhou,0;,2023/9/5,17,6.1 结构体,6.1.2 结构体变量的定义与初始化,main()int i,n;printf(Enter voten);scanf(%d,/*输入所投候选人编号*/,2023/9/5,18,6.1 结构体,6.1.2 结构体变量的定义与初始化,for(i=1;i=5;i+)printf(%s:%dn,listi.name,listi.count);printf(%s:%dn,list0.name,list0.count);,2023/9/5,19,6.1 结构体,1.结
13、构体指针变量的定义,结构体指针变量定义的一般形式:struct 结构体名*指针变量名;,struct date int year,month,day;*q;,例如:struct student*p;,p是指向struct student结构体变量的指针变量,6.1.3 结构体的指针,2023/9/5,20,6.1 结构体,6.1.3 结构体的指针,2.结构体成员的三种引用形式,用结构体变量名的引用形式:d.year d.month d.day,struct date int year,month,day;d,*p=,用结构体指针变量的引用形式:(*p).year(*p).month(*p).d
14、ay p-year p-month p-day,“-”是指向结构体成员运算符,优先级为一级,p=&d.year,2023/9/5,21,6.1 结构体,6.1.3 结构体的指针,【例6_a】输入今天的日期,然后输出该日期。main()struct date/*在函数中定义结构体类型*/int year,month,day;today,*p=,2023/9/5,22,6.1 结构体,6.1.3 结构体的指针,3.指向结构体数组的指针,【例6.7】利用结构体指针输出一组化学 元素名称及其原子量。struct list int i;char name4;float w;tab4=1,H,1.008,
15、2,He,4.0026,3,Li,6.941,4,Be,9.01218;,2023/9/5,23,6.1 结构体,6.1.3 结构体的指针,3.指向结构体数组的指针,main()struct list*p;printf(NotNametAtomic Weightn);for(p=tab;pi,p-name,p-w);,No Name Atomic Weight,1 H 1.008,2 He 4.0026,3 Li 6.941,4 Be 9.01218,2023/9/5,24,6.1 结构体,6.1.3 结构体的指针,【例6.8】分析自增自减运算对程序结果的影响。struct code int
16、i;char c;a=100,A,200,B,300,C,400,D;,2023/9/5,25,6.1 结构体,6.1.3 结构体的指针,main()struct code*p=a;printf(%dt,+p-i);printf(%ct,(+p)-c);printf(%dt,(p+)-i);printf(%ct,+p-c);printf(%dt,p-i+);printf(%dn,p-i);,p,101,D,301,101,B,200,D,300,301,2023/9/5,26,6.1 结构体,6.1.4 函数间结构体数据的传递,方法一:在函数之间直接传递结构体数据。函数的形参定义为结构体变量。
17、函数调用时,可将主调函数的结构体类型实参传递给被调函数的形参。如果将函数定义为结构体类型函数,可利用return语句将一个结构体数据结果返回到主调函数中。,2023/9/5,27,6.1 结构体,6.1.4 函数间结构体数据的传递,方法二:在函数之间传递结构体指针。形参定义为指向结构体类型的指针变量,可将主调函数的结构体指针传递给被调函数的形参变量,通过指针形参的指向域的扩展,操作主调函数中结构体变量及其成员。如果将函数定义为结构体指针型函数,可利用return语句将被调函数中结构体变量的指针返回给主调函数的结构体指针变量。方法三:利用全局结构体变量传递结构体数据。,2023/9/5,28,6
18、.1 结构体,6.1.4 函数间结构体数据的传递,【例6.6】编制一个复数乘法函数,采用值传递的方 法传送数据。struct complex/*定义存放复数的结构体类型*/float re;/*re成员用于存放复数的实部*/float im;/*im成员用于存放复数的虚部*/;,2023/9/5,29,6.1 结构体,6.1.4 函数间结构体数据的传递,struct complex multiplier(struct complex cx,struct complex cy)struct complex cz;cz.re=cx.re*cy.re-cx.im*cy.im;cz.im=cx.re*
19、cy.im+cx.im*cy.re;return(cz);,形参是结构体变量。调用此函数时,系统将分别为形参cx和cy各分配一个sizeof(struct complex)大小的内存空间,每个成员都要一一传递。,2023/9/5,30,6.1 结构体,6.1.4 函数间结构体数据的传递,main()struct complex x,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;z=multiplier(x,y);printf(%f+%fin,z.re,z.im);/*以复数形式输出*/,2023/9/5,31,6.1 结构体,6.1.4 函数间结构体数据的传递
20、,【例6.10】编制一个复数乘法函数,采用传递指针 的方法达到传送数据的目的。struct complex float re,im;void multiplier(struct complex*px,struct complex*py,struct complex*pz)pz-re=px-re*py-re-px-im*py-im;pz-im=px-re*py-im+px-im*py-re;,形参定义为指针型参数。函数调用时,实参传递的是结构体指针(地址),因此形参px、py可读取主调函数中变量的内容,乘积结果也可通过形参pz指针存到主调函数中的目标变量。这样实参与形参之间的数据传递由多值(每个
21、成员的值)变成了单值(结构体变量的首地址)。,2023/9/5,32,6.1 结构体,6.1.4 函数间结构体数据的传递,main()struct complex x,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;multiplier(,2023/9/5,33,链表是一种动态数据结构,可根据需要动态地分配存储单元。在数组中,插入或删除一个元素都比较繁琐,而用链表则相对容易。但是数组元素的引用比较简单,对于链表中结点数据的存取操作则相对复杂。,6.1 结构体,6.1.5 结构体的应用链表,链表中每个元素称为一个结点。构成链表的结点必须是结构体类型数据。,1.链表
22、的基本结构,相邻结点的地址不一定是连续的,依靠指针将 它们连接起来。,struct nodechar c;struct node*next;,2023/9/5,34,C语言提供了相关的存储管理库函数。这里仅介绍其中三个,它们的原型说明在“stdlib.h”头文件和“alloc.h”头文件中,使用这三个函数时,应选择其中一个头文件包含到源程序中。,动态分配存储区函数malloc()函数原型:void*malloc(unsigned size);调用格式:malloc(size)功能:在内存分配一个size字节的存储区。调用 结果为新分配的存储区的首地址,是一个void 类型指针。若分配失败,则返
23、回NULL(即0)。,6.1 结构体,6.1.5 结构体的应用链表(选学内容),2.动态分配和释放存储单元,在ANSI C标准中,关键字void有两种用法。第一种用法,可将无返回值的函数定义为void类型第二种用法,用void*定义指针,这是一个指向非具体数据类型的指针,称为无类型指针。,2023/9/5,35,【例6.11】调用malloc函数分配所需存储单元。#include main()struct st int n;struct st*next;*p;p=(struct st*)malloc(sizeof(struct st);p-n=5;p-next=NULL;printf(p-n=
24、%dtp-next=%xn,p-n,p-next);,6.1 结构体,6.1.5 结构体的应用链表,2.动态分配和释放存储单元,将函数返回值转换成结构体指针,2023/9/5,36,动态分配存储区函数calloc()函数原型:void*calloc(unsigned int n,unsigned int size);调用格式:calloc(n,size)功能:在内存分配一个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。,6.1 结构体,6.1.5 结构体的应用链表,2.动态分配和释放存储单元,2023/9/5,37,【例
25、6.12】调用calloc函数分配所需存储单元。#include main()int i,*ip;ip=(int*)calloc(10,2);for(i=0;i10;i+)scanf(%d,ip+i);for(i=0;i10;i+)printf(%d,*(ip+i);printf(n);,6.1 结构体,6.1.5 结构体的应用链表,2.动态分配和释放存储单元,动态分配了10个存放整型数据的存储单元,2023/9/5,38,释放动态分配存储区函数free()函数原型:void free(void*p);,6.1 结构体,6.1.5 结构体的应用链表,2.动态分配和释放存储单元,此函数无返回值,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用
链接地址:https://www.31ppt.com/p-5933126.html