08章 结构体类型和联合体类型——C语言程序设计技术

上传人:a**** 文档编号:243014897 上传时间:2024-09-13 格式:PPT 页数:36 大小:195.50KB
返回 下载 相关 举报
08章 结构体类型和联合体类型——C语言程序设计技术_第1页
第1页 / 共36页
08章 结构体类型和联合体类型——C语言程序设计技术_第2页
第2页 / 共36页
08章 结构体类型和联合体类型——C语言程序设计技术_第3页
第3页 / 共36页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,程序设计技术,C语言数据描述和C程序设计初步,结构化程序设计根底和C语言的控制结构,数组及其应用,函数与C程序结构,指针与函数,指针与数组,字符串及其应用,结构体类型和联合体类型,C语言的文件处理及其应用,位运算与枚举类型,结构体类型和联合体类型,结构体数据类型的根本概念,结构体数组,结构体数据类型与指针的关系,联合体数据类型的根本概念,8.1 结构体类型的根本概念,结构体类型概述,计算机应用中特别是在事务处理中,常常需要将不同的数据组合成为一个有机的整体,这些数据不属于同种数据类型,但这些数据又相互关联,用以描述一个操作对象的各种属性。这种由一些属于不同数据类型的数据组合而成的构造数据类型称为结构体类型。例如,学生登记表。,结构体类型的特点,结构体类型由假设干个数据项组成,其中每一个数据项称为一个结构体成员,它们都属于一种已经定义的数据元素。,系统并没有预先定义结构体类型,须由设计者事先构造。,要使用结构体类型数据,必须要先定义结构体类型,然后再定义此种类型的变量。,8.1.1,结构体类型和变量的定义,定义结构体类型的一般形式:,struct,结构体名,数据类型 结构体成员,1,;,数据类型 结构体成员,2,;,.,.,.,数据类型 结构体成员,n,;,;,struct student, char num8;,char name20;,char sex;,int age;,float Score;,;,定义结构体类型变量的三种方法,先定义结构体类型,然后定义变量。,struct,结构体名 变量列表;,定义结构体类型的同时定义结构体变量。,struct,结构体名,结构体成员列表;,结构体变量列表;,直接定义结构体变量。,struct,结构体成员列表;,结构体变量列表;,8.1.1,结构体类型和变量的定义,定义结构体类型变量的三种方法,先定义结构体类型,然后定义变量,同时定义结构体类型和变量,只定义结构体类型变量,struct A, long number;,char name20;,int x;,float y;,;,struct A,a1,a2;,struct B, long number;,char name20;,int x;,float y;,b1,b2;,struct, long number;,char name20;,int x;,float y;,c1,c2;,8.1.1,结构体类型和变量的定义,结构体类型的嵌套定义,结构体类型可以嵌套定义,即定义的一个结构体类型的成员中可以有属于另外一个已经定义完成的结构体类型的变量。,struct date, int year;,int month;,int day;,;,struct student, long number;,char name20;,struct date,birthday;,int age;,char address80;,long tel;,;,8.1.1,结构体类型和变量的定义,为已经存在的数据类型取别名,typedef 数据类型名 别名;,例:typedef int INTEGER;,那么:int j,k; 等价于 INTEGER j,k;,定义构造类型时为这些类型取别名,typedef struct 结构体名,结构体成员列表;,结构体类型别名;,注意:定义别名后,程序中可使用原类型名或别名定义变量,别名习惯上用大写字母。,8.1.2,关键字,typedef,的简单应用,8.1.2,关键字,typedef,的简单应用,struct student, long number;,struct date birthday;,char name20;,int age;,char sex;,char address80;,long tel;,;,typedef,struct student,STU,;,STU,stu1,stu2,stu3,struct student,等价于,STU,typedef,struct student, long number;,struct date birthday;,char name20;,int age;,char sex;,char address80;,long tel;,STU,;,STU,stu1,stu2,stu3;,struct student stu1,stu2;,使用,typedef,构造复杂数据类型,构造指定长度的字符串数据类型,typedef char String100;,String,是字符串数据类型的类型名。,String s1;,等价于,char s1100;,构造指针数据类型,typedef int *IP;,定义,IP,为整型的指针类型。,IP p1,p2;,等价于,int *p1,*p2;,例,8-1,用,typedef,构造指定长度的字符串类型,例,8-3,用,typedef,构造指针数据类型。,8.1.2,关键字,typedef,的简单应用,8.1.3,结构体变量的引用和输入输出,结构体变量的引用,C,语言不允许将结构体变量作为整体操作,只能操作它的成员分量。成员分量的引用形式如下:,结构体变量名,.,成员名,例如:,stu1.sex stu1.tel,对于嵌套的结构体变量,访问其成员时应采用逐级访问的方法,直到得到所需访问的成员为止。,结构体变量名,.,一级成员名,.,二级成员名,例如:,stu1.birthday.month,当有两个同类型结构体变量时,可将一个结构体变量作为一个整体赋值给另外一个结构体变量。,特别提示:,嵌套的结构体成员分量的数据类型与最后一个成员分量的数据类型一致。,例:设有结构体类型及变量定义,struct A, int x;,float y;,;,struct B, struct A a;,char c;,;,struct B b;,则有:,b.a.x,整型变量,b.a.y,实型变量,b.c,字符型变量,8.1.3,结构体变量的引用和输入输出,结构体变量的初始化,定义结构体变量的同时初始化:,struct 标识符 变量名=结构体变量成员值列表;,struct student stu2,stu1=,5001,1988,12,30,Liwei,19,m,12 songlin,65102621;,stu2=stu1; /两个同类型结构体变量的整体赋值,结构体变量的输入输出,结构体变量不能作为一个整体进行输入或输出。只能将结构体变量的成员作为输入输出的对象。,例8-5 结构体变量引用和输入输出例如,8.1.3,结构体变量的引用和输入输出,8.1.4,结构体变量作函数参数,结构体变量作为函数参数,结构体变量可以作为函数的参数在函数之间进行传递。使用结构体变量作为函数参数时,数据的传递仍然是“传值方式;要求实参和形参的类型须一致。,实现方式:函数调用时系统为形参变量开辟一段内存单元按照结构体变量所需要的存储单元数以存放从实参传递过去的各结构体变量成员分量的值。,例8-6 结构体变量作函数参数例如,struct TEST, int x;,char ch;,;,实参,struct TEST a;,a,a.x,a.ch,b,b.x,b.ch,形参,struct TEST b;,10,a,a,10,8.1.5,结构体作函数的返回值类型,返回结构体类型函数概念,结构体类型的数据对象不但能作为函数参数在函数之间传递,还可以作为函数的返回值。当函数的返回值类型是一个结构体类型时,该函数就称为返回结构体类型的函数。,函数定义形式,struct 标识符 函数名(形式参数表及定义), 函数的定义和声明局部;,函数的执行局部;,例8-7 返回结构体类型函数的例如,结构体类型和联合体类型,结构体数据类型的根本概念,结构体数组,结构体数据类型与指针的关系,联合体数据类型的根本概念,结构体数组的概念,结构体数组中的每一个数组元素都是具有相同结构体类型的结构体变量。,如一个班的学生档案,某单位的工资表。,结构体数组的定,义,定义结构体数组的方式与定义结构体变量相同,只须说明它为数组类型。也有三种方法:,struct,结构体名 数组名,常量表达式,;,使用,typedef,为结构体类型名取别名来定义结构体数组。,STU stu130;,8.2.1,结构体数组的定义和元素引用,结构体数组的初始化,定义结构体数组的同时进行初始化,初始化的一般形式为:,struct,结构体名 数组名,=,初始化数据列表,;,8.2.1,结构体数组的定义和元素引用,例:设有结构体类型定义,sturct person, char name20;,int count;,;,sturct person stu3=“Zhang,0,“Wang,0,“Li,0;,结构体数组元素的引用,一个结构体数组元素就相当于一个结构体变量,其引用某一元素成员的方法与引用结构体变量成员的方法相同。其形式为:,数组名下标.成员名,不能将结构体数组元素作为一个整体直接进行输入输出,可以将一个结构体数组元素作为一个整体赋给同一结构体数组的另外一个元素,或赋给一个同类型的结构体变量。,例8-8 结构体数组操作例如,8.2.1,结构体数组的定义和元素引用,结构体数组作函数参数,结构体数组可以作为函数的参数在函数间进行传递。使用结构体数组作为函数参数时,实现的是“传地址值调用。即实参数组将全部或局部存储区域提供给形参数组共享。,例8-9 结构体数组作函数参数例如,struct A, int x;,char c;,;,a,(,实参:,struct A a3;),b,(,形参:,struct A b),8.2.1,结构体数组的定义和元素引用,结构体类型和联合体类型,结构体数据类型的根本概念,结构体数组,结构体数据类型与指针的关系,联合体数据类型的根本概念,8.3.1,结构体类型与指针的关系,指向结构体变量的指针,通过指针变量访问结构体变量的成员形式:,*指针变量.成员名;,指针变量名-成员名;,struct A, int x;,float y;,a1,*p=,&a1,=,p,a1,=,*p,a1.x (*p).x,a1.y (*p).y,p-x,p-y,struct person, char name20;,int count;,stu, *p=,p,&stu,stu,*p,8.3.1,结构体类型与指针的关系,p,stu.name,指针变量,p,与结构体变量,stu,的关系,stu.count,stu,执行赋值语句:,P-name=“liu;,P-count=33;,Liu,33,用结构体指针作为函数的参数,用指向结构体变量的指针,作为函数的参数,实现的,是“传地址值调用,可以,提高程序的执行效率。,typedef struct stu, char name20;,int age;,float score;,STU,;,实参,STU,st3,*P=st,;,st0,wang,形参,STU *X;,X,p,87,19,chen,zhao,20,99,88,18,st1,st2,P-name,P-score,8.3.1,结构体类型与指针的关系,例8-10 输入假设干个学生信息并输出,8.3.2,结构体数组与指针的关系,指向结构体数组的指针,指针指向结构体数组中某个数组元素,struct A, char c;,int x;,a5,*p1;,p1=,&a2,=,p1,a2,=,*p1,a2.c (*p1).c,a2.x (*p1).x,p1-c,p1-x,a,p1,例,8-11,移动指向结构体数组的指针操作结构体数组元素。,指向结构体数组的指针,指针指向某结构体数组的首地址,(,指针未移动,),&ai,=,p2+i,ai,=,*(p2+i),ai.c (*(p2+i).c,ai.x (*(p2+i).x,(p2+i)-c,(p2+i)-x,struct A, char c;,int x;,a5,*p2;,p2=a;,8.3.2,结构体数组与指针的关系,a,p2,例,8-12,不移动指向结构体数组的指针操作结构体数组元素。,结构体类型和联合体类型,结构体数据类型的根本概念,结构体数组,结构体数据类型与指针的关系,联合体数据类型的根本概念,8.5 联合体数据类型的根本概念,问题的提出及对策,问题的提出,在计算机应用中,常常遇到数据对象的某一个区域值会随条件不同而为不同内容。此时要求增加同一存储区域数据类型的可变性来处理。,解决方法,C语言通过定义联合体共用体类型数据,允许不同数据类型的数据使用共同的存储区域。,8.5.1,联合体类型的定义和变量引用,联合体,(,共用体,),类型的定义,联合体类型的定义确定了参与共用存储区域的成员项以及成员项具有的数据类型。,联合体类型的定义形式:,union,标识符,数据类型 成员项,1,;,数据类型 成员项,2,;,数据类型 成员项,n,;,;,定义联合体变量的三种方式,先定义联合体类型,后定义联合体类型变量;,union,联合体名,成员列表;,;,union,联合体名 变量列表;,同时定义联合体类型和联合体类型变量;,union,联合体名,成员列表;,变量列表;,直接定义联合体类型变量;,union,成员列表;,变量列表;,8.5.1,联合体类型的定义和变量引用,同时定义联合体类型和变量,union test, int a;,long b;,key;,定义了一个联合体类型union test和该类型的联合体类型变量key,,32位系统中该类型所占的存储单元长度为8个字节,由变量key的两个成员分量分时复用共享。,8.5.1,联合体类型的定义和变量引用,联合体变量的引用,联合体变量不能直接用于操作处理,只能操作它的成员。引用联合体变量成员项形式如下:,联合体变量名,.,成员名,;,特别提示:,一个联合体变量不是同时存放多个成员的值,而只能存放一个成员项的值,即联合体变量最后一次赋值后的内容。,联合体类型指针变量,可以定义指向联合体变量的指针。,例8-15 联合体变量引用例如,8.5.1,联合体类型的定义和变量引用,8.5.2,联合体类型与结构体类型的区别,变量的存储长度不同,结构体变量所占内存长度取决于所有成员分量占用的内存长度;,联合体变量所占内存长度取决于其占内存长度最长的成员分量;,赋值后所呈现的状态不同,对于结构体变量,其每一个成员分量占用不同的存储空间,对某一成员的赋值与其它成员无关。,对于联合体变量,所有成员分量共享同一段存储区域,对某一成员的赋值会影响到其它成员。,例8-17 结构体变量与联合体变量存储空间比较,例8-18 结构体变量与联合体变量的赋值比较,struct A, int x;,char c2;,a;,a.x=0x4142;,a.c0=a;,a.c1=b;,union B, int x;,char c2;,b;,b.x=0x4142;,b.c0=a;,b.c1=b;,a.x,a.c0,a.c1,b.x,b.c0,b.c1,0x42,0x41,0x61/,a,0x62/,b,0x42,0x41,0x61,0x62,8.5.2,联合体类型与结构体类型的区别,16,位系统中,结构体变量,a,所占存储单元长度为,4,字节,联合体变量,b,所占存储单元长度为,2,字节。,使用联合体变量的注意点:,一个联合体变量不是同时存放多个成员的值,而是只能存放一个成员项的值,这个值就是该联合体变量最后被赋予的值。,在两个同类型的联合体变量之间可以使用变量名直接赋值。,联合体变量不能初始化,不能整体引用或赋值。,联合体的特点是地址共用。联合体中可以包含结构体成员,结构体中也可以包含联合体成员。,结构体包含联合体成员,例,8-16,编程实现简单的人事数据管理,使用联合体变量的注意点,联合体应用举例,联合体包含结构体成员,综合读程序,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 商业计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!