第六章结构体和共用体(正式)_第1页
第六章结构体和共用体(正式)_第2页
第六章结构体和共用体(正式)_第3页
第六章结构体和共用体(正式)_第4页
第六章结构体和共用体(正式)_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1程序设计程序设计计算机学院计算机学院 第六章第六章2第第6 6章章 结构体与共用体结构体与共用体 6.1 6.1 结构体概述结构体概述6.1.1 6.1.1 结构体的引入结构体的引入 为了方便处理多个数据项的数据,常常把这些关系密切但类型不同的数据项组织在一起,即“封装”起来,并为其取一个名字,在C语言中,就称其为结构体(有些高级语言称之为记录)。所以,结构体通常是由不同数据类型的数据项组成,一般也称是由不同成员组成,因此可以说:一个结构体可包含若干成员,每一个成员可具有不同的名字及数据类型。 结构体的引入为处理复杂的数据结构提供了有力的手段,也为函数间传递一组不同数据类型的数据提供了方便,

2、特别是对于数据结构较为复杂的大型程序提供了方便。36.1.2 6.1.2 结构体类型的定义结构体类型的定义 结构体类型结构体类型和简单类型不同,简单类型是由系统预定和简单类型不同,简单类型是由系统预定义的,如义的,如intint、floatfloat、charchar,直接可以使用。而直接可以使用。而结构体类型结构体类型是根据需要由程序员自行定义,因此在使用之前必须先定义是根据需要由程序员自行定义,因此在使用之前必须先定义结构体类型。结构体类型。 结构体类型定义结构体类型定义struct 结构体名结构体名 类型标识符类型标识符 成员名;成员名; 类型标识符类型标识符 成员名;成员名; .;合法

3、标识符可省:无名结构体成员类型可以是基本型或构造型struct是关键字,不能省略4例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student s1;namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节.结构体类型定义描述结构的组织形式,定义类型时不分配内存,当定义变量时分配内存单元5说明说明(1)(1) 定义一个结构体类型只是描述了此结构体的组织形定义一个结构体类型只是描述了此结构体的组织形式,在编译时并不为其分配存储空间

4、,即仅描述此数据结式,在编译时并不为其分配存储空间,即仅描述此数据结构的形态或者说模型,故不能对定义的一个结构体类型进构的形态或者说模型,故不能对定义的一个结构体类型进行赋值、存取或运算。行赋值、存取或运算。(2)(2)结构体的成员可以是简单变量、数组、指针、结构体结构体的成员可以是简单变量、数组、指针、结构体或公用体等。或公用体等。 (3)(3)结构体类型定义可以放在函数内部,也可以放在函数结构体类型定义可以放在函数内部,也可以放在函数外部。若放在内部,则只在函数内有效;若放在外部,则外部。若放在内部,则只在函数内有效;若放在外部,则从定义点到源文件尾之间的所有函数都有效。从定义点到源文件尾

5、之间的所有函数都有效。(4)(4)结构体成员的名字可以同程序中的其它变量同名,二结构体成员的名字可以同程序中的其它变量同名,二者不会相混,系统会自动识别它。者不会相混,系统会自动识别它。 66.2 6.2 结构体变量结构体变量6.2.1 6.2.1 结构体变量的定义与初始化结构体变量的定义与初始化1结构体变量的定义 同其它变量一样,结构体变量也必须先定义,然后才能引用。一个结构体变量的定义可以有以下三种方式:(1) 先定义类型再定义变量 (推荐)(推荐)其形式:struct stud_typechar name10;long num;char sex;int age; float score

6、;char address10;struct stud_type student1, student2;7(2) (2) 在定义类型的同时定义变量在定义类型的同时定义变量(推荐)(推荐)其形式其形式: :struct stud_typestudent1, student2; (3) (3) 直接定义结构体变量直接定义结构体变量其形式其形式: :structstudent1,student2;8说明说明(1)(1) 在定义结构体类型时,系统并不分配内存空间,仅当在定义结构体类型时,系统并不分配内存空间,仅当定定义结构体变量时,系统才为被定义的每一变量分配相应的存义结构体变量时,系统才为被定义的每

7、一变量分配相应的存储单元储单元。如上面定义的结构体变量。如上面定义的结构体变量student1student1、student2student2在内在内存中各占存中各占3131个字节(个字节(10+4+1+2+4+10=3110+4+1+2+4+10=31)(2)(2) 结构体变量的定义一定要在结构体类型定义之后或同时结构体变量的定义一定要在结构体类型定义之后或同时进行,对尚未定义的结构体类型,不能用它来定义结构体变进行,对尚未定义的结构体类型,不能用它来定义结构体变量。量。例如:例如:对一个教师对一个教师teacherteacher的结构体类型未作定义,则下面的的结构体类型未作定义,则下面的

8、变量定义变量定义 struct teacher struct teacher teah1teah1 是错误的;反之亦然;是错误的;反之亦然;对某变量对某变量birthdaybirthday (也称结构体成员变量),若其类型未作也称结构体成员变量),若其类型未作定义,就写定义,就写struct date_type birthday; struct date_type birthday; 也是错误的。也是错误的。 92. 2. 结构体变量的初始化结构体变量的初始化 所谓所谓结构体变量初始化结构体变量初始化,就是在定义结构体变量的同时,就是在定义结构体变量的同时,对其成员变量赋初值,对其成员变量赋初

9、值,在赋值时应注意按顺序及类型依次为在赋值时应注意按顺序及类型依次为每个结构体成员指定初始值。每个结构体成员指定初始值。结构体初始化的一般结构体初始化的一般格式格式为:为:struct struct 结构体类型名结构体类型名 结构体变量结构体变量=初始化值初始化值 ;说明说明(1)(1)初始化数据之间用逗号分隔。初始化数据之间用逗号分隔。(2)(2) 初始化数据的个数一般与成员的个数相同,若小于成员初始化数据的个数一般与成员的个数相同,若小于成员数,则剩余的成员将被自动初始化为数,则剩余的成员将被自动初始化为0 0(若成员是指针,则(若成员是指针,则初始化为初始化为NULLNULL)。)。(3

10、)(3) 初始化数据的类型要与相应成员变量的类型一致。初始化数据的类型要与相应成员变量的类型一致。初始化时只能对整个结构体变量进行,不能对结构体类型中初始化时只能对整个结构体变量进行,不能对结构体类型中的某个成员进行初始化赋值。的某个成员进行初始化赋值。10例:例:struct date_type int year;int mouth;int day;;struct stud_typechar name10; long num; char sex; struct date_type birthday; float score; char address10; ; void main()stru

11、ct stud_type student1=wang,196103,m,1978,10,12,98,Xian;struct stud_type student2=liu,196105,m,1980,9,22,88,Benjing;116.2.2 6.2.2 结构体变量的引用结构体变量的引用1. 1. 对结构体变量成员的引用对结构体变量成员的引用 在在C C语言程序中,语言程序中,不准许对结构变量不准许对结构变量整体整体进行各种运算、赋值进行各种运算、赋值或输入输出操作,而只能是对其成员进行此类操作。或输入输出操作,而只能是对其成员进行此类操作。引用结构体变量成员的一般引用结构体变量成员的一般形

12、式形式: 结构体变量名结构体变量名. .成员名成员名其中其中 . . 是结构体成员运算符,其优先级别最高,结合性是自左至是结构体成员运算符,其优先级别最高,结合性是自左至右。由此对结构体成员就完全可以像操作简单变量一样操作它。右。由此对结构体成员就完全可以像操作简单变量一样操作它。如:如:对上例定义的结构体变量对上例定义的结构体变量student1student1或或student2student2,可作如下的赋可作如下的赋值操作:值操作:10= wang;10= wang;student1.num=196103;student1.num=1

13、96103;student1.sex=m;student1.sex=m;student1.birthday.year=1978;student1.birthday.year=1978;student1.birthday.mouth=10;student1.birthday.mouth=10;student1.birthday.day=12;student1.birthday.day=12;student1.score=98;student1.score=98;122. 2. 对结构体变量整体的引用对结构体变量整体的引用 结构体变量和简单变量相比,除了上面所述在参加各种结构体变量和简单变量相比,

14、除了上面所述在参加各种运算、赋值或输入输出方式上有所不同外运算、赋值或输入输出方式上有所不同外即是由结构体即是由结构体变量成员完成,其它同简单变量一样,如:变量成员完成,其它同简单变量一样,如:(1) (1) 可以相互赋值,但注意相互赋值的两个结构体变量必须可以相互赋值,但注意相互赋值的两个结构体变量必须是同一个结构体类型;是同一个结构体类型;如:如:student1=student2;student1=student2;(2) (2) 可作为函数的形参、实参或函数返回值,详见下节。可作为函数的形参、实参或函数返回值,详见下节。136.2.3 6.2.3 结构体变量作为函数参数结构体变量作为函

15、数参数结构体变量成员作函数参数结构体变量成员作函数参数结构体变量中的所有成员都可作为函数参数结构体变量中的所有成员都可作为函数参数struct stud_typestruct stud_type char name10;char name10;long num;long num;char sex;char sex;student1;student1;现将结构体变量现将结构体变量student1student1的三个成员分别传递给函数的三个成员分别传递给函数func1(),func2(),func3()func1(),func2(),func3():func1();fu

16、nc1();func2(student1.num);func2(student1.num);func1(student1.sex);func1(student1.sex);14若需要将成员地址传递给函数,则只需在其前加取地址符若需要将成员地址传递给函数,则只需在其前加取地址符“& &”。如如:func1();func2(&student1.num);func1(&student1.sex);其中字符数组名其中字符数组名name代表其成员地址,故不许要写代表其成员地址,故不许要写“&”。2. 2. 结构体

17、变量整体作函数参数结构体变量整体作函数参数老板本的老板本的C C系统不允许用结构体变量作函数参数,只允许用指向结系统不允许用结构体变量作函数参数,只允许用指向结构体变量的指针作函数参数(第构体变量的指针作函数参数(第7 7章),传递的是结构体变量的首章),传递的是结构体变量的首地址。而地址。而ANSI CANSI C取消了这一限制,规定取消了这一限制,规定按值传递方式按值传递方式。在函数调用。在函数调用时,系统为形参结构体变量分配存储空间,并从相应的实参结构体时,系统为形参结构体变量分配存储空间,并从相应的实参结构体变量中取得各成员的值,若对形参中结构体变量各成员值进行修改,变量中取得各成员的

18、值,若对形参中结构体变量各成员值进行修改,并不能修改实参结构体变量各成员的值。这里要注意,实参和形参并不能修改实参结构体变量各成员的值。这里要注意,实参和形参结构体变量类型应当完全一致。结构体变量类型应当完全一致。156.3 6.3 结构体数组结构体数组6.3.1 6.3.1 结构体数组的定义与初始化结构体数组的定义与初始化1. 1. 结构体数组的定义结构体数组的定义 在定义结构体数组时其定义方法与定义结构体变量方法类似,在定义结构体数组时其定义方法与定义结构体变量方法类似,也有三种形式。也有三种形式。定义如下:定义如下:struct date_type int year; int mouth

19、; int day;;struct stud_type char name10;long num;char sex;struct date_type birthday;float score;char address10;struct stud_type student3; 16由此就定义了一个结构体数组由此就定义了一个结构体数组student3student3,它有它有3 3个个元素,每个元素都是元素,每个元素都是struct stud_typestruct stud_type类型,各占类型,各占3535个字节(个字节(10+4+1+(2+2+2)+4+10=3510+4+1+(2+2+2)

20、+4+10=35)。)。 172. 2. 结构体数组的初始化结构体数组的初始化 结构体数组在定义的同时可以初始化。其一般格式结构体数组在定义的同时可以初始化。其一般格式是在定义之后紧跟一个用花括号括起来的一组初始数据,是在定义之后紧跟一个用花括号括起来的一组初始数据,为了增强可读性,最好使每一个数组元素的初始数据也为了增强可读性,最好使每一个数组元素的初始数据也用花括弧括起来,以此来区分各个数组元素。用花括弧括起来,以此来区分各个数组元素。对上所定义的结构体数组对上所定义的结构体数组studentstudent初始化如下:初始化如下:stuct stud_type student2= wang

21、,196103, m,1978,10,12,98, xian, zhang,196102, f,1977,1,10,87, Beijing;18说明说明(1)(1) 可以将一个结构体数组元素赋值给同一结构体类型数组中另一可以将一个结构体数组元素赋值给同一结构体类型数组中另一个元素,或赋给同一类型的变量。个元素,或赋给同一类型的变量。如如:struct stud_type student3, student1struct stud_type student3, student1;现在就定义了一个结构体数组现在就定义了一个结构体数组studentstudent,又定义了一个结构体变又定义了一个结构

22、体变量量student1student1,则下面的赋值合法。则下面的赋值合法。studentlstudentlstudent0student0;student0=student1;student0=student1;studnet1=student1;studnet1=student1;(2)(2) 不能把结构体数组元素作为一个整体直接进行输入或输出。不能把结构体数组元素作为一个整体直接进行输入或输出。如如 printf (%d,student0)printf (%d,student0);或或scanf(%d,&student0)scanf(%d,&student0);只能以单

23、个成员为对象进行输入输出,只能以单个成员为对象进行输入输出,如:如:scanf(%s, )scanf(%s, );scanf(%ld,scanf(%ld,student0.num)student0.num);printf (%s%ldn, , student0.num)printf (%s%ldn, , student0.num);19例 统计后选人选票struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0

24、; void main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count);namecountLiZhangWang000206.3.3 6.3.3 结构体数组作函数参数结构体数组作函数参数 与结构体变量一样,结构体数组作为函与结构体变量一样,结构体数组作

25、为函数参数传递也只有在数参数传递也只有在C C的高版本中才支持,但的高版本中才支持,但它们是有本质区别的,当然在定义形参与实它们是有本质区别的,当然在定义形参与实参的结构体类型时还是必须一致,当参的结构体类型时还是必须一致,当实参实参为为结构体数组时,其形参须定义为同类型结构结构体数组时,其形参须定义为同类型结构的的结构体数组结构体数组或或结构体指针结构体指针 ;结构体数组作函数参数21例6.3 键盘输入n名学生信息,要求输出用函数print 完成。(P141)#include struct stud_type char name10; int num; float score3;void p

26、rint(struct stud_type stu,int n);void main() int i,n; struct stud_type stu130; printf(“请输入学生人数n:n”); scanf(“%d”,&n); printf(“请输入%d名学生信息(姓名,学号 3门课成绩):n”,n); for (i=0;in;i+) scanf(“%s%d%f%f%f”,,&stu1i.num,&stu1i.score0, &stu1i.score1,&stu1i.score2);print(stu1,n);22void pr

27、int(struct stud_type stu, int n) int I; printf(“姓名 学号 成绩1 成绩2 成绩3:n”); for(i=0;in;i+) printf(%-8s%8d%8.2f%8.2f%8.2fn”,,stui.num,stui.score0, num,stui.score1, num,stui.score2);例6.4 键盘输入10名学生信息,每个学生有姓名 学号 成绩,要求用一个排序函数sort 完成按学生成绩降序排列,并输出学生成绩排行榜。(主函数完成输入,输出) P 14323#define N 10#include #includ

28、e struct stud_type char name10; int num; int score;;void sort(struct stud_type stu);void main() int i; struct stud_type stuN; printf(“请输入%d名学生信息(姓名,学号 成绩):n”,N); for(i=0;iN;i+) scanf(“%s%d%d”, ,&stui.num,&stui.score); sort(stu); printf(“排序后n”); for(i=0;iN;i+) printf(“%-8s%5d%5dn”,,stui.num,stui.score);24void sort(struct stud_type stu) int i,k,j; struct stud_type t; for (i=0;iN-1;i+) k=i; for(j=i+1;jN;j+) if(stuk.score(y)?(x):(y) .main() int a,b,c,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论