
用户定义数据类型.ppt
26页人民邮电出版社第十章 用户定义数据类型人民邮电出版社10.1 结构结构(Structure)10.2 位域位域(Bit_Fields)10.3 联合联合(Unions)10.4 枚举枚举(Enumerations)人民邮电出版社10.1 结构结构(Structure)10.1.1 结结构构的的定定义义、结结构构变变量量说说明明和和结结构构变变量量成成员员的访问的访问 结构是不同数据类型的数据集合与数组相比,结构是不同数据类型的数据集合与数组相比,数组是相同数据类型数据的集合数组中的数据是相数组是相同数据类型数据的集合数组中的数据是相互关联的互关联的 人民邮电出版社1. 结构的定义结构的定义 结构是一个基本类型数据的变量集,它有一个结构是一个基本类型数据的变量集,它有一个名字,称为结构名结构中的各变量,在逻辑上,名字,称为结构名结构中的各变量,在逻辑上,一般都有一定的内在联系组成结构的各变量,称一般都有一定的内在联系组成结构的各变量,称作结构元素或结构成员作结构元素或结构成员 结构定义类型,是通过结构定义语句完成的,结构定义类型,是通过结构定义语句完成的,其定义的关键字是其定义的关键字是struct。
定义结构的一般形式为:定义结构的一般形式为: struct 结构名 数据类型 成员名; ;人民邮电出版社2. 结构类型变量的定义结构类型变量的定义 第一种定义形式:与一般变量的类型定义的方第一种定义形式:与一般变量的类型定义的方法一样 第二种定义形式:在定义结构的同时,将要定第二种定义形式:在定义结构的同时,将要定义为结构类型的变量直接写在该结构定义的右花括义为结构类型的变量直接写在该结构定义的右花括号之后,最后再以分号结束语句号之后,最后再以分号结束语句 人民邮电出版社3. 结构成员的访问结构成员的访问 在程序中,我们引用结构的成员时,使用在程序中,我们引用结构的成员时,使用如下的引用方式:如下的引用方式: 其中其中“.”是成员选择符是成员选择符(或称点操作符,或称点操作符,成员运算符成员运算符) 人民邮电出版社10.1.2 结构变量的初始化结构变量的初始化 结构变量初始化的方法,与结构变量定义采用结构变量初始化的方法,与结构变量定义采用的形式相对应的形式相对应 人民邮电出版社10.1.3 结构数组结构数组 结构数组的定义结构数组的定义 结构类型变量可以是数组这样的数组称为结结构类型变量可以是数组。
这样的数组称为结构数组所谓结构数组,是这样一种数组,它的每构数组所谓结构数组,是这样一种数组,它的每个元素都是同一类型的结构个元素都是同一类型的结构 应用结构数组时,首先是定义结构,然后将数应用结构数组时,首先是定义结构,然后将数组变量说明为该结构类型组变量说明为该结构类型 人民邮电出版社10.1.4 把结构传递给函数把结构传递给函数 结构变量既可以作为函数的参数,也可以作为函结构变量既可以作为函数的参数,也可以作为函数的返回值将结构类型变量作为函数的参数时,可数的返回值将结构类型变量作为函数的参数时,可有两种情况:形参是结构的元素和形参是整个结构有两种情况:形参是结构的元素和形参是整个结构现分述如下现分述如下人民邮电出版社1. 把结构元素传递给函数把结构元素传递给函数 把结构变量的指定元素传递给函数,可以通过把结构变量的指定元素传递给函数,可以通过值调用实现,也可以通过引用调用实现值调用实现,也可以通过引用调用实现 (1) 值调用值调用 值调用就是把元素的值传递给函数,如同传递值调用就是把元素的值传递给函数,如同传递一个简单变量一个简单变量 (2) 引用调用引用调用 当希望传递结构元素的地址给函数时,要采用当希望传递结构元素的地址给函数时,要采用引用调用。
这时必须在变量名前加一个操作符引用调用这时必须在变量名前加一个操作符&2. 把整个结构传递给函数把整个结构传递给函数 整个结构作为实参向函数传递时,实参和形参整个结构作为实参向函数传递时,实参和形参的结构类型必须匹配,这里只介绍采用值调用的情的结构类型必须匹配,这里只介绍采用值调用的情况 人民邮电出版社10.1.5 结构指针结构指针1. 结构指针说明结构指针说明 使使用用结结构构指指针针之之前前,先先要要定定义义结结构构指指针针变变量量 定定义义的的格格式式是是把把符符号号“* ”放放在在要要定定义义的的指指针针变变量量名名的前面其一般形式如下:的前面其一般形式如下: struct 结构名 *指针变量名;人民邮电出版社2. 结构指针的应用结构指针的应用 结构指针主要有两个方面的应用:对函数的结构指针主要有两个方面的应用:对函数的引用调用和在链表或动态数据结构中的应用引用调用和在链表或动态数据结构中的应用1) 函数的引用调用函数的引用调用 把整个结构作为函数的参数传递给函数的缺把整个结构作为函数的参数传递给函数的缺点是,全部结构元素的压入堆栈和弹出堆栈的开点是,全部结构元素的压入堆栈和弹出堆栈的开销很大。
销很大 人民邮电出版社 第一种方法是使用指针运算符第一种方法是使用指针运算符*例如, (*p).name 表示访问指针表示访问指针p所指结构的成员所指结构的成员name注意,这里的圆括号是必须的它表示先访问指针变量所这里的圆括号是必须的它表示先访问指针变量所指向的结构指向的结构 第二种方法是使用指向结构成员运算符第二种方法是使用指向结构成员运算符(由一减号和一大于号组成由一减号和一大于号组成)例如,访问指针例如,访问指针p所所指结构的成员指结构的成员name,可写为:,可写为: p name这两种写法是等价的这两种写法是等价的人民邮电出版社3. 结构指针作为函数返回值结构指针作为函数返回值 我们已经知道,函数的返回值可以是指针结我们已经知道,函数的返回值可以是指针结构指针也不例外用于接收函数返回值的变量,必构指针也不例外用于接收函数返回值的变量,必须是具有相同结构类型的结构指针变量须是具有相同结构类型的结构指针变量 主主函函数数的的输输出出结结构构的的数数据据时时,使使用用了了两两种种访访问问结构成员的形式:结构成员的形式: samp_ptr-a (*samp_ptr).b 其效果是一样的。
其效果是一样的人民邮电出版社10.2 位域位域(Bit_Fields) C语言的特点之一,语言的特点之一, 是它能对字节或字节中是它能对字节或字节中的一位或多位进行操作这种以的一位或多位进行操作这种以bit表示操作对表示操作对象的能力,给程序设计带来很大方便象的能力,给程序设计带来很大方便 人民邮电出版社10.2.1 位域结构的定义位域结构的定义 位域是这样一种数据结构,它定义每个元素位域是这样一种数据结构,它定义每个元素的的(二进制二进制)位数位域结构定义的一般形式为:位数位域结构定义的一般形式为: struct name type name1:length; type name2:length; type nameN:length; 定义位域的关键字也是定义位域的关键字也是struct 人民邮电出版社 各各成成员员的的值值,按按照照定定义义的的顺顺序序,在在一一个个字字的的各位中逐个存放例如:各位中逐个存放例如: struct bit_data unsigned a:2 unsigned b:1 unsigned c:3 ;人民邮电出版社10.2.2 位域结构变量的说明位域结构变量的说明 位域类型变量的说明方法与结构类型变量的说明方法是一位域类型变量的说明方法与结构类型变量的说明方法是一样的。
样的 struct bit_data data1,data2;其一般形式为:其一般形式为: struct 位域类型名位域类型名 变量名表;变量名表;位位域域类类型型变变量量也也可可以以在在定定义义位位域域类类型型的的同同时时进进行行说说明明其其一一般般形式为:形式为: struct 位域类型名位域类型名 unsigned a:2 unsigned b:1 unsigned c:3 位域类型变量名表位域类型变量名表;人民邮电出版社10.2.3 位域变量的引用位域变量的引用 位位域域变变量量成成员员的的引引用用,也也与与结结构构一一样样,可可以以用用圆圆点点“.”运运算算符符来来表表示示例例如如,访访问问前前面面例例子子中变量中变量data1的成员的成员a: 又如对其赋值,可写为:又如对其赋值,可写为: data1.a=1;人民邮电出版社10.3 联合联合(Unions)10.3.1 联合类型的定义联合类型的定义 联联合合类类型型是是在在同同一一个个存存储储空空间间,可可以以为为几几个个不不同同数数据据类类型型的的成成员员所所使使用用联联合合类类型型的的定定义义与与结结构构类似,其一般形式为:类似,其一般形式为: union 联合类型名 数 据 类 型 成 员 名 (变 量 ); ;人民邮电出版社 这这两两个个不不同同类类型型的的变变量量共共同同使使用用一一个个存储单元,如图存储单元,如图10.3所示。
所示图10.3 联合类型示意图 人民邮电出版社10.3.2 联合类型变量的说明联合类型变量的说明 联合类型定义后,就可以对该数据类型变量进联合类型定义后,就可以对该数据类型变量进行说明和结构一样,联合数据类型变量的说明也行说明和结构一样,联合数据类型变量的说明也有两种方式第一种方式是,把被说明的联合类型有两种方式第一种方式是,把被说明的联合类型变量写在联合类型定义的右花括号之后,例如下面变量写在联合类型定义的右花括号之后,例如下面定义了两个联合类型定义了两个联合类型u的变量的变量u_a和和u_b: union u int i; char ch; u_a,u_b;人民邮电出版社 第二种方法是,写一个单独的联合类型变第二种方法是,写一个单独的联合类型变量定义语句例如:量定义语句例如: union u u_a, u_b; 在定义一个联合类型变量时,编译器产生在定义一个联合类型变量时,编译器产生一个能够存放联合成员中最长变量的空间,供一个能够存放联合成员中最长变量的空间,供各成员共同使用各成员共同使用人民邮电出版社10.3.3 联合类型变量的引用联合类型变量的引用 访问联合类型变量的语法形式,与访问结构访问联合类型变量的语法形式,与访问结构类型变量的成员一样,使用点操作符或箭头操作类型变量的成员一样,使用点操作符或箭头操作符。
符 两种引用的格式如下:两种引用的格式如下: 联合变量名联合变量名.成员名成员名 指向联合的指针变量名指向联合的指针变量名-成员名成员名 联联合合类类型型的的特特点点是是在在同同一一个个存存储储空空间间,可可以以存存储储若若干干个个数数据据(包包括括不不同同类类型型的的数数据据)但但是是,它它不不能能同同时时存存放放几几个个数数据据在在同同一一时时间间只只能能存存放放一个数据一个数据人民邮电出版社10.4 枚举枚举(Enumerations)10.4.1 枚举类型的定义枚举类型的定义 枚枚举举类类型型是是一一个个用用名名字字代代表表整整型型常常量量的的集集合合:它它的关键字是的关键字是enum枚举类型定义的一般格式为:枚举类型定义的一般格式为: enum enum_type_name enumeration list ); 其其中中enum_type_name是是所所定定义义的的枚枚举举类类型型的的名名字字;enumeration list 是是枚枚举举清清单单,是是用用逗逗号号隔隔开开的的名字表这些枚举的名字可看做是整型常量这些枚举的名字可看做是整型常量 人民邮电出版社10.4.2 枚举类型变量的定义枚举类型变量的定义 枚举类型变量的定义方法与结构类似,也有两枚举类型变量的定义方法与结构类似,也有两种形式:可以说明在定义的右花括号后,也可以用种形式:可以说明。












