结构体类型和联合体类型-C语言程序设计技术.ppt
程序设计技术,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 结构体类型和变量的定义,定义结构体类型变量的三种方法先定义结构体类型,然后定义变量 同时定义结构体类型和变量 只定义结构体类型变量,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,stu3struct 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 当有两个同类型结构体变量时,可将一个结构体变量作为一个整体赋值给另外一个结构体变量。,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 结构体变量作函数参数示例,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 结构体数组作函数参数示例,8.2.1 结构体数组的定义和元素引用,结构体类型和联合体类型,结构体数据类型的基本概念 结构体数组 结构体数据类型与指针的关系联合体数据类型的基本概念,8.3.1 结构体类型与指针的关系,指向结构体变量的指针 通过指针变量访问结构体变量的成员形式:(*指针变量).成员名;指针变量名-成员名;,struct person char name20;int count;stu,*p=,8.3.1 结构体类型与指针的关系,执行赋值语句:P-name=“liu”;P-count=33;,Liu33,用结构体指针作为函数的参数 用指向结构体变量的指针作为函数的参数,实现的是“传地址值调用”,可以提高程序的执行效率。,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 结构体数组与指针的关系,指向结构体数组的指针 指针指向结构体数组中某个数组元素,例8-11 移动指向结构体数组的指针操作结构体数组元素。,指向结构体数组的指针 指针指向某结构体数组的首地址(指针未移动),8.3.2 结构体数组与指针的关系,例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 结构体变量与联合体变量的赋值比较,0 x42,0 x41,0 x61/a,0 x62/b,0 x42,0 x41,0 x61,0 x62,8.5.2 联合体类型与结构体类型的区别,16位系统中结构体变量a所占存储单元长度为4字节,联合体变量b所占存储单元长度为2字节。,使用联合体变量的注意点:一个联合体变量不是同时存放多个成员的值,而是只能存放一个成员项的值,这个值就是该联合体变量最后被赋予的值。在两个同类型的联合体变量之间可以使用变量名直接赋值。联合体变量不能初始化,不能整体引用或赋值。联合体的特点是地址共用。联合体中可以包含结构体成员,结构体中也可以包含联合体成员。结构体包含联合体成员 例8-16 编程实现简单的人事数据管理,使用联合体变量的注意点,联合体应用举例,联合体包含结构体成员 综合读程序,