资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第十一章 结构体,结构体,结构体与函数,本章小结,作业,第十一章 结构体结构体,1,考虑这样一类数据:一个数据项由多个子数据项组成,而且每个子数据项的类型可能不一样。,在人事档案管理中,每个人的自然情况表可能包含:,名字(字符串型),年龄(整型),出生时间(三个整型),性别(枚举)等等。,研究人造卫星,每个人造卫星的信息可能包括:,名字(字符型),发射时间(三个整数),重量(实型),直径(实型),轨道半径(实型),赤道夹角(实型)等等。,考虑这样一类数据:一个数据项由多个子数据项组成,而且每个子数,2,数组可描述由,同类型,子数据项组成的数据。,结构体可描述由,不同类型,子数据项组成的数据,名字,年龄,出生时间 年 月 日,性别,名字,发射时间 年 月 日,重量,直径,轨道半径,与赤道夹角,数组可描述由同类型子数据项组成的数据。名字年龄出生时间,3,结构体,结构体类型,结构体类型是分量的集合,分量也称成员、成分、域,结构体类型定义形式A,结构体类型定义形式B,struct,t id,.,id;,.,t id,.,id;,struct sid,t id,.,id;,.,t id,.,id;,结构体结构体类型结构体类型定义形式A结构体类型定义形式Bst,4,例11-1 一个人的自然情况表 卫星数据类型,enum sext male,female ;,struct date,int year,month,day;,;,struct preson,char name10;,int age;,enum sext sex;,struct date birthdate;,;,struct mansatellite,char name10;,struct date,lounchdate;,float weight,,diameter,,orbitrad,,angle;,;,例11-1 一个人的自然情况表,5,year:,month:,day:,date是一个结构体类型,包含三个成分,成分year为int类型,成分month为int类型,成分day为int类型,year:month:day:date是一个结构体类型,包含,6,preson是一个结构体类型,包含四个成分,成分name为数组类型,成分age为int类型,成分sex为枚举类型,成分birthdate仍为一个结构体类型,name:,age:,sex:,year:,birthdate:,month:,day:,preson是一个结构体类型,包含四个成分name:age:,7,mansatellite是一个结构体类型,包含六个成分,name:,year:,lounchdate:,month:,day:,weight:,diameter:,orbitrad:,angle:,mansatellite是一个结构体类型,包含六个成分nam,8,结构体类型引用,在struct后跟以结构体标签,称为“结构体类型引用”。在例11-1的结构体类型定义的意义下:,struct date,struct preson,struct mansatellite,都是结构体类型引用,使用它们将分别标记相应结构体定义。,结构体类型引用,9,结构体类型说明符:结构体类型定义和结构体类型引用统称“结构体类型说明符”,使用结构体类型说明符可以,定义,结构体类型的,类型名,声明,结构体类型,变量,结构体类型说明符:结构体类型定义和结构体类型引用统称“结构,10,结构体类型名,使用 typedef 可以定义结构体 类型名typedef 结构体类型说明符 标识符,例子,typedef struct int y,m,d datetype;,struct date int y,m,d;typedef struct date datetype;,结构体类型名使用 typedef 可以定义结构体 类型名t,11,例11-2 定义结构体类型名,typedef struct date,int year,month,day;,datetype;,typedef char tstring1010;,typedef struct ,tstring10 name;,int age;,enum sext sex;,struct date birthdate;,presontype;,typedef struct mansatellite mansatellitetype,datetype birthdate;,例11-2 定义结构体类型名typedef struct,12,结构体变量,结构体类型变量声明可以采取如下三种形式之一,使用结构体类型引用,直接使用结构体类型定义,使用typedef定义的结构体类型名,结构体变量结构体类型变量声明可以采取如下三种形式之一,13,例11-3 结构体变量声明,struct preson zhang;,struct date,int year,month,day;,dateofbirth;,struct ,char author10;,datetype publish_date;,int page_number;,programming;,mansatellitetype first_east;,变量zhang用结构体类型引用声明,是struct preson类型,具有如图结构,name:,age:,sex:,year:,birthdate:,month:,day:,例11-3 结构体变量声明struct preson,14,例11-3 结构体变量声明,struct preson zhang;,struct date,int year,month,day;,dateofbirth;,struct ,char author10;,datetype publish_date;,int page_number;,programming;,mansatellitetype first_east;,变量programming使用不带结构体标签的结构体类型定义声明,包含3个成分,分别为字符数组类型的author、datetype类型的publish_date、int类型的page_number,结构如图所示;,author:,year:,publish_date:,month:,day:,page_number:,例11-3 结构体变量声明struct preson,15,例11-3 结构体变量声明,struct preson zhang;,struct date,int year,month,day;,dateofbirth;,struct ,char author10;,datetype publish_date;,int page_number;,programming;,mansatellitetype first_east;,变量first_east使用typedef定义的类型标识符mansatellitetype声明,具有如图结构,name:,year:,lounchdate:,month:,day:,weight:,diameter:,orbitrad:,angle:,例11-3 结构体变量声明struct preson,16,类型定义不分配,存储空间,只说明一个数据类型的框架结构。,变量声明,时才给变量,分配存储空间,,并且使得被声明的变量具有相应类型的结构。,到目前为止声明的四个变量zhang、dateofbirth、programming、first_east具有实体,被分配存储空间。,类型标识符datetype、mansatellitetype只是定义了一个数据类型的框架,不占用存储空间,只给相应类型起一个名字。,类型定义不分配存储空间,只说明一个数据类型的框架结构。,17,指向结构体变量的指针,C可以定义指向任何类型的指针类型,并声明相应指针类型的变量,结构体类型当然不例外。,指向结构体变量的指针C可以定义指向任何类型的指针类型,并声明,18,struct preson *pointer_preson;,struct date,int year,month,day;,*dateofpointer;,struct ,char author10;,datetype publish_date;,int page_number;,*p;,mansatellitetype *p_east,例11-4 指向结构体类型变量的指针变量,变量pointer_preson为指向标签为preson的结构体类型变量的指针变量。pointer_preson可以指向相应结构体类型的变量。比如,pointer_preson=,变量p为指向无标签结构体类型变量的指针变量。P 可以指向相应结构体类型的变量。比如,p=,变量p_east为指向结构体类型mansatellitetype变量的指针变量。p_east 可以指向相应结构体类型的变量。比如,p_east=,struct preson *pointer_preso,19,结构体变量的成分,访问结构体变量的一个成分,使用成员选择表达式,成员选择表达式 直接成员选择,间接成员选择,直接成员选择 后缀表达式.标识符,间接成员选择 后缀表达式-标识符,结构体变量的成分访问结构体变量的一个成分,使用成员选择表达式,20,直接成员选择,直接成员选择表达式针对一般的结构体变量。,形式是:,r.w,r 是后缀表达式,最终计算出一个结构体变量;,w是 r 所属结构体类型中的一个成员名字,下述成员选择表达式是合法的:,zhang.name,programming_pascal.author,直接成员选择,21,间接成员选择,间接成员选择表达式针对指向结构体变量的指针变量,形式是,p-w,p 是后缀表达式,最终计算出一个指向结构体变量的,指针变量,;,w 是p所指向结构体变量所属类型中的一个成员名字,下述成员选择表达式是合法的:,pointer_preson-name,p_east-weight,p_east-lounchdate,间接成员选择,22,也可首先对指针变量进行求地址运算,然后使用直接成员选择,比如上述三个选择表达式还可以写成如下形式。由于优先级的原因,这里的括号是必须的,(*pointer_preson).name,(*p_east).weight,(*p_east).lounchdate,也可首先对指针变量进行求地址运算,23,由于成员选择表达式本身也是一个变量访问,它是相应成分类型的一个变量,它与成分类型的其它变量一样,凡是可以使用那些变量的地方都可以使用成员选择表达式。,对于嵌套结构体,可以认为“成员选择表达式”仍然是一个“后缀表达式”,所以可以继续应用“成员选择表达式”的规则访问里层的成分。,zhang.birthdate.month,p_east-lounchdate.year,由于成员选择表达式本身也是一个变量访问,它是相应成分类型的一,24,例11-5 设计表示复数的结构体类型,给出复数加法和乘法函数,解:/*复数类型*/,typedef struct complex,float real_part,imaginary_part;,complex_type,例11-5 设计表示复数的结构体类型,,25,/*复数加法*/,complex_type complex_add(complex_type x,complex_type y),complex_type add;,add.real_part=x.real_part+y.real_part;,add.imaginary_part=x.imaginary_part+y.imaginary_part;,return add;,/*复数加法*/,26,/*复数乘法*/,complex_type complex_mul(complex
展开阅读全文