资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,结构体概述,结构体的引入,和一个学生有关的数据:,姓名、性别、学号、年龄、,家庭住址、学习成绩,这些数据项之间,关系密切但数据类型不尽,相同,,若分别定义多个变量,就会割裂这些数据,项之间的内在联系。,数组?,1,为了方便处理,多个数据项,的数据,常把这些,关系密切但类型不同,的数据项组织在一起,,即,“封装”,起来,并为其取一个名字,在,C,语言中,,就称其为,结构体,。,结构体通常是由不同数据类型的数据项组成,一般也称是由不同成员组成,因此可以说:,一个结构体可包含若干成员,每一个成员可具有不同的名字及数据类型。,结构体的引入为,处理复杂的数据结构,提供,了有力的手段,也,为函数间传递一组不同数据,类型的数据,提供了方便,特别是对于数据结构,较为复杂的大型程序提供了方便。,2,结构体类型的定义,结构体类型,和简单类型不同,,简单类型,是由系统预定义的,如,int、float、char,,直接可以使用,。而,结构体类型,是根据需要,由程序员自行定义,,因此在使用之前,必须先定义结构体类型,。,结构体类型定义:,struct,结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,合法标识符,可省;,无名结构体,成员类型可以是,基本型或构造型,struct,是,关键字,不能省略,注意:这里说的是定义结构体类型而不是变量。,3,例,struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,结构体类型定义描述结构,的组织形式,,不分配内存,4,说明:,(1)定义一个,结构体类型,只是描述了此结构体的组织形,式,在编译时,并不为其分配,存储空间,即仅描述此,数据结构的形态或者说模型,故不能对定义的一个,结构体类型进行赋值、存取或运算。,结构体的成员可以是简单变量、数组、指针、结构体或,共用体等。,(3)结构体类型定义可以,放在函数内部,,也可以放在,函数外,部,。若放在内部,则只在函数内有效;若放在外部,,则从定义点到源文件尾之间的所有函数都有效。,(4)结构体成员的,名字,可以同程序中的其它变量,同名,,二者,不会相混,系统会自动识别它。,例如:刚才定义的结构体中,,年龄改用生日来描述。,定义结构体:,struct date_type,int year;,int month;,int day;,;,这样,关于学生信息的结构体,可定义为:,struct stud_type,struct date_type birthday;,;,注意:结构体,date_type,一定要定义在结构体,stud_type,之前。,5,结构体与共用体,结构体概述,结构体变量,结构体数组,共用体,枚举类型,用,typedef,定义类型,6,结构体变量,结构体变量的定义与初始化,1,.,结构体变量的定义,先定义,再引用。,一个结构体变量的定义可以有,三种方式,。,7,struct stud_type,char name10;,long num;,char sex;,int age;,float score;,char address10;,;,struct stud_type,student1,student2,;,(1)先,定义类型,再,定义变量,直观,灵活!,8,(2)在定义类型的,同时,定义变量,struct stud_type,student1,student2,;,(3),直接,定义结构体变量,struct,student1,student2,;,第一种的简略形式。,用于结构体类型仅做一次性使用的场合。,9,说明:,(1)在定义,结构体类型,时,系统,并不分配内存,空间,,仅当,定义结构体变量时,,系统才为,被定义的每一变量,分配相应的存储单元,。,如上面定义的结构体变量,student1、,student2,在内存中各占3,3,个字节,(10+4+1+,4+4+10=33,);,(2),结构体变量的定义一定要在结构体类型定义,之后,或,同时,进行。,(2),结构体变量,的定义一定要在结构体类型,定义,之后,或,同时,进行,对尚未定义的,结构体类型,不能用它来定义结构体变量。,例,struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,name,num,sex,age,score,addr,4,字节,4,字节,20,字节,1,字节,4,字节,30,字节,.,例如:,对一个教师,teacher,的结构体类型未作定义,,则下面的变量定义,struct teacher,teah1,是错误的;,10,2,.,结构体变量的初始化,所谓,结构体变量初始化,,就是在定义结构体变量的同时,对其成员变量,赋初值,。,在赋值时应注意,按顺序及类型,依次为每个结构体成员指定初始值。,结构体初始化的一般,格式,为,:,struct,结构体类型名 结构体变量=初始化值;,例,struct student,char name20;,int num;,char sex;,int age;,float score;,char addr30;,;,struct stud_type student1=,“wang”,196103,m,20,98,”xian”;,11,说明:,(1)初始化数据之间用,逗号,分隔。,(2)初始化数据的个数一般与成员的,个数相同,,,若,小于,成员数,则剩余的成员将被自动,初始,化为0,(若成员是指针,则初始化为,NULL)。,(3),初始化数据的,类型,要与相应成员变量的类型,一致。,不一致将强制类型转换,。,(4),初始化时只能对,整个结构体变量,进行,,不能,对结构体类型中的,某个成员,进行初始化赋值。,12,struct date_type,int year;,int mouth;,int day;,;,void main(),struct stud_type,student1=,wang,196103,m,1978,10,12,98,Xian;,struct stud_type,student,2,=,liu,196105,m,1980,9,22,88,Benjing;,printf(%d,student1.birthday.day);,struct stud_type,char name10;,long num;,char sex;,struct date_type birthday;,float score;,char address10;,;,13,结构体变量的引用,1.对结构体变量成员的引用,在,C,语言程序中,不准许对结构变量整体进行各种运算、赋值或输入输出操作,而,只能对其成员,进行此类操作。,引用结构体变量成员的一般形式:,结构体变量名,.,成员名,其中“.”是结构体成员运算符,其,优先级别最高,,结合性是,自左至右,。由此对结构体成员就完全可以像操作简单变量一样操作它。,14,如:对上例定义的结构体变量,student1,或,student2,,可作如下的赋值操作:,student1.name10=wang;,strcpy(student1.name,”wang”),student1.num=196103;,student1.sex=m;,student1.birthday.year=1978;,student1.birthday.mouth=10;,student1.birthday.day=12;,student1.score=98;,还可以如下操作:,sum=student1.score+student2.score;,scanf(“%s%d”,student1.name,&,student1.num);,printf(“%s%d”,student1.name,student1.num);,错误,正确,15,2.对结构体变量整体的引用,结构体变量和简单变量相比,除了上面所述,在参加各种运算、赋值或输入输出方式上有所不同外即是由结构体变量成员完成,其它,同简单变量一样,,如:,(1),可以相互赋值,,但注意相互赋值的两个结构体,变量必须是同一个结构体类型;,如:,student1=student2;,(2),可作为函数的形参、实参或函数返回值。,16,结构体变量作为函数参数,结构体变量,成员,作函数参数,结构体变量中的所有成员都可作为函数参数。,struct stud_type,char name10;,long num;,char sex;,student1;,将结构体变量,student1,的三个成员分别传递给函数,func1(),func2(),func3():,func1(student1.name);,func2(student1.num);,func3(student1.sex);,17,若需要将成员地址传递给函数,则只,需在其前加取地址符“,&,”。,如,:,func1(student1.name);,func2(,&,student1.num);,func3(,&,student1.sex);,其中字符数组名,name,代表其成员地址,故不需要写“,&,”。,18,2.结构体变量,整体,作函数参数,老板本的,C,系统不允许用结构体变量作函数,参数,只允许用指向结构体变量的指针作函数参数,,传递的是结构体变量的首地址。,而,ANSI C,取消了这一限制,,规定按值传递方式,。,在函数调用时,,系统为形参结构体变量分配存储空间,,,并从相应的实参结构体变量中取得各成员的值,若,对,形参中结构体变量各成员值进行修改,并不能修改实,参结构体变量各成员的值,。,注意,实参和形参结构体变量,类型,应当完全一致。,P125,例,6.2,19,结构体与共用体,结构体概述,结构体变量,结构体数组,共用体,枚举类型,用,typedef,定义类型,20,结构体数组,结构体数组的定义与初始化,1.结构体数组的定义,结构体数组:数组的成员是结构体类型数据元素。,在定义结构体数组时,其定义方法与定义,结构体变量方法类似,也有,三种形式,。,第一种定义方式:,21,struct date_type,int year;,int mouth;,int day;,;,struct stud_type,char name10;,long num;,char sex;,struct date_type birthday;,float score;,char address10;,;,struct stud_type student3;,由此就定义了一个结构体数组,数组名是,
展开阅读全文