《C语言课件第10讲.ppt》由会员分享,可在线阅读,更多相关《C语言课件第10讲.ppt(33页珍藏版)》请在三一办公上搜索。
1、第十讲,Begin:,第十章 结构体和共用体,结构体类型的定义结构体类型变量的定义结构体类型变量的初始化和引用结构体数组,9.1 结构体,结构体是数目固定、类型不同的若干变量(成员)的有序集合,在内存中占据一段连续的存储空间。在程序中使用结构体,必须先做两项工作:1)定义结构体类型:描述该结构体的成员名称、成员类型;2)定义结构体变量:根据结构体类型为定义的结构体变量分配存储空间。,9.1.1 结构体类型的定义,结构体类型定义的一般格式为:struct 结构体名 类型名1 成员名1;类型名2 成员名2;类型名n 成员名n;,9.1.1 结构体类型的定义,结构体类型定义的格式说明:struct:
2、关键字,是定义结构体类型的标志。结构体名:标识符,其命名规则同变量名。struct 结构体名:结构体类型名,作用等同于int、float等关键字,用于定义结构体变量。类型名1n:说明了结构体成员的数据类型。成员名1n:用户定义的一个或多个结构体成员的名称,其命名规则同变量名。多个同类型的成员彼此间用逗号分隔。,9.1.1 结构体类型的定义,结构体类型定义举例:struct _Student char id10;/*学号*/char name10;/*姓名*/int score3;/*成绩*/int sum;/*总分*/;,9.1.2 结构体类型变量的定义,结构体类型的定义只是指出了该结构体的组
3、成情况,系统并不会为它分配实际的存储单元。应在定义了结构体类型以后,再定义该结构体类型的变量(简称结构体变量),以便在结构体变量中存放具体的数据。结构体变量的定义方式有三种:先定义结构体类型,再定义结构体变量。在定义结构体类型的同时定义结构体变量。直接定义结构体变量。,9.1.2 结构体类型变量的定义,方式一:若事先已定义了结构体类型,那么直接用下面的格式定义结构体变量:结构体类型名 结构体变量名;例如:struct _Student stu1,stu2;stu1和stu2的存储形式为:,9.1.2 结构体类型变量的定义,方式二:在定义结构体类型的同时定义结构体变量。定义格式为:struct
4、结构体名 类型名1 成员名1;类型名2 成员名2;类型名n 成员名n;结构体变量名表;,9.1.2 结构体类型变量的定义,例如:struct _Student char id10;char name10;int score3;int sum;stu1,stu2;,9.1.2 结构体类型变量的定义,方式三:在定义结构体类型时可以直接定义结构体变量。定义格式为:struct 类型名1 成员名1;类型名2 成员名2;类型名n 成员名n;结构体变量名表;,9.1.2 结构体类型变量的定义,例如:struct char id10;char name10;int score3;int sum;stu1,s
5、tu2;,9.1.2 结构体类型变量的定义,关于结构体的说明:类型与变量是不同的概念,应注意区分。系统可以对变量赋值、存取、运算,而类型则不能。编译时,系统只为变量分配存储单元,而类型则不分配。结构体中的成员也可以是一个结构体变量,即结构体的嵌套。结构体中的成员可以和程序中的变量同名,不同结构体中的成员也可以同名。,9.1.2 结构体类型变量的定义,例如:struct date int year,month,day;struct _Student2 char id10;char name10;struct date birth;/*birth为结构体成员*/int score3;int sum
6、;stu1,stu2;,9.1.2 结构体类型变量的定义,关于结构体的说明:可以使用typedef关键字为结构体类型定义一个别名。例如:typedef struct _Student char id10;char name10;int score3;int sum;Student;,9.1.2 结构体类型变量的定义,以后就可以用Student代替结构体类型名来定义结构体变量了。例如:Student stu1,stu2;等价于:struct _Student stu1,stu2;,9.1.3 结构体类型变量的初始化和引用,结构体变量的初始化类似于对数组的初始化,由于结构体变量的成员可以有不同的数
7、据类型,所以各个初值必须与相应成员保持类型一致或兼容。例1:struct _Student char id10;char name10;int score3;int sum;stu1=20050001,胡树伟,87,71,81;,9.1.3 结构体类型变量的初始化和引用,例2:struct date int year,month,day;struct _Student2 char id10;char name10;struct date birth;int score3;int sum;stu2=20050002,李冬,1987,5,3,75,85,76;,9.1.3 结构体类型变量的初始化和
8、引用,对结构体变量初始化的说明:对结构体变量进行初始化时,系统是按每个成员在结构体变量中的顺序一一对应赋初值的。若只对部分成员进行初始化,则只能给前面的若干成员赋值,而不允许跳过前面的成员给后面的成员赋值。例如:前面两例中结构体变量stu1和stu2的成员sum没有获得指定初值,而是获得默认初值0。,9.1.3 结构体类型变量的初始化和引用,引用结构体变量的一般方式为:结构体变量名成员名其中:为结构体成员运算符,1级运算符。例如:stu1.sum表示对结构体变量stu1中的sum成员进行引用。,9.1.3 结构体类型变量的初始化和引用,结构体变量的引用规则:不能将结构体变量作为一个整体进行输入
9、和输出。例如:struct _Student3 long num;int age;char sex;st;下面的写法是错误的:scanf(%ld%d%c,9.1.3 结构体类型变量的初始化和引用,结构体变量的引用规则:内嵌结构体成员的引用,必须逐层使用成员名定位,找到最底层的成员。例如:struct date int year,month,day;struct _Student2 char id10,name10;struct date birth;int score3,sum;stu2=20050002,李冬,1987,5,3,75,85,76;printf(birthday=%d,%d,%
10、dn,stu2.birth.year,stu2.birth.month,stu2.birth.day);,9.1.3 结构体类型变量的初始化和引用,结构体变量的引用规则:若结构体的成员是字符数组,可对其进行直接引用。例如:struct _Student char id10;char name10;int score3;int sum;stu1;scanf(%s%s,stu1.id,stu1.name);printf(id=%s,name=%s,stu1.id,stu1.name);,9.1.3 结构体类型变量的初始化和引用,结构体变量的引用规则:若结构体的成员是数值型数组,则应逐个引用数组中的
11、元素。例如:struct _Student char id10;char name10;int score3;int sum;stu1;scanf(%d%d%d,9.1.3 结构体类型变量的初始化和引用,例 结构体变量的输入和输出typedef struct _Student char id10,name10;int score3,sum;Student;/*定义结构体类型别名*/void main()Student stu1,stu2;/*定义结构体变量*/scanf(%s%s%d%d%d,stu1.id,stu1.name,9.1.4 结构体数组,结构体数组的每个数组元素都是一个结构体变量
12、,它们都分别包括各个成员项。结构体数组的定义和定义结构体变量的方法相似,只需说明其为数组即可。例1:struct _Student char id10,name10;int score3,sum;struct _Student stu50;,9.1.4 结构体数组,例2:struct _Student char id10,name10;int score3,sum;stu50;例3:struct char id10,name10;int score3,sum;stu50;,9.1.4 结构体数组,结构体数组的初始化结构体数组的初始化与普通数组的初始化相似。例如:struct _Student
13、char id10,name10;int score3,sum;struct _Student stu3=20050001,胡树伟,87,71,81,20050002,李冬,75,85,76,20050003,梁若婵,86,75,90;,9.1.4 结构体数组,结构体数组的引用结构体数组的引用与结构体变量的引用相似。例 结构体数组的引用 typedef struct _Student char id10;char name10;int score3;int sum;Student;/*定义结构体类型别名*/,9.1.4 结构体数组,void main()int i,j;Student stu5
14、0;/*定义结构体数组*/for(i=0;i50;i+)scanf(%s%s%d%d%d,stui.id,stui.name,9.1.4*结构体数组名作为函数参数,结构体数组名作为函数参数与普通数组名作为函数参数相似,传递的也是数组的首地址。例 结构体数组名作为函数参数 typedef struct _Student char id10;char name10;int score3;int sum;Student;/*定义结构体类型别名*/void sort(Student stu,int);/*函数原型声明*/,9.1.4*结构体数组名作为函数参数,void main()int i,j;St
15、udent stu50;/*定义结构体数组*/for(i=0;i50;i+)scanf(%s%s%d%d%d,stui.id,stui.name,9.1.4*结构体数组名作为函数参数,void sort(Student stu,int count)int i,j;Student t;for(i=1;i=count-1;i+)for(j=1;j=count-i;j+)if(stuj-1.sumstuj.sum)t=stuj-1;stuj-1=stuj;stuj=t;,The End,上机实验内容:(1)熟悉结构体类型和结构体变量的定义和引用(2)熟悉结构体数组的定义和引用(3)实验教程第九章 结构体和共用体 实验一(1)(2),