资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7章 结构体与共用体,C语言程序设计,共同点:都是由若干个元素(或成员)构成。 不同点: (1)数组中各元素类型相同.例:int a10; 而结构体、共用体中各个成员类型不相同。 (2)在程序中使用结构体等构造类型时,首先要对其成员(元素)进行描述(说明),然后才能用该类型去定义相应变量。而数组则不用。,概 述,如果在程序中要处理那些具有不同类型、而又相互关联的一组数据时,必须使用C语言中提供的结构体类型和共用体类型。它们有一个共同的特点是可以由不同数据类型的多个成员组成。 例如,一个学生的学籍信息中可以包括学号、姓名、性别、年龄、成绩等数据项,这些数据项类型不同,但都是跟一个学生相联系的,因此就可以将其定义成一个结构体类型。其中学号、姓名、性别、年龄、成绩等称为该结构体类型的成员。,7.1 结构体类型与结构体变量,结构体类型是一种构造的数据类型,也就是说,它是多个数据的集合体。组成结构体的每个数据称为该结构体的成员或成员项。 在程序中使用结构体类型时,首先要对结构体的成员进行描述,这称为 结构体类型的定义(说明)。,7.1.1结构体类型的定义(说明),struct 结构体名 数据类型 成员1; 数据类型 成员2; 数据类型 成员n; ;,结构体类型定义的一般格式为:,struct student char no10; /*学号*/ char name20; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float score; /*成绩*/ ;,可以省略,struct student是结构体类型的标识符,在语法上和int 、float、char 等数据类型的标识符性质一样,处于同等地位,注意: (1)结构体类型定义的位置,可以在函数内部,也可以在函数外部。在函数内部定义的结构体类型,只能在函数内部使用;在函数外部定义的结构体类型,其有效范围是从定义处开始,直到它所在的源程序文件结束。 (2)对结构体类型进行定义,只是定义了一种C语言中原来没有的,而用户实际需要的新的数据类型,列出了该结构体的组成情况,标志着这种结构体类型的“模式”已经存在,但在程序编译时,系统并不会为该结构体类型分配任何存储空间。只有利用这种结构体类型定义相应的变量时才分配内存空间。,7.1.2 结构体变量的定义(三种形式),struct 结构体类型名 数据类型 成员1; 数据类型 成员2; 数据类型 成员n; ; 结构体类型 结构体变量名表;,1先定义结构体类型,再定义结构体类型的变量。,struct student char no10; /*学号*/ char name20; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float score; /*成绩*/ ; struct student s1,s2;,7.1.2 结构体变量的定义(三种形式),struct 结构体类型名 数据类型 成员1; 数据类型 成员2; 数据类型 成员n; 结构体变量名表;,2在结构体类型定义的同时定义结构体类型的变量。,struct student char no10; /*学号*/ char name20; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float score; /*成绩*/ s1,s2;,7.1.2 结构体变量的定义(三种形式),struct 数据类型 成员1; 数据类型 成员2; 数据类型 成员n; 结构体变量名表;,3直接定义结构体类型的变量。,struct char no10; /*学号*/ char name20; /*姓名*/ char sex; /*性别*/ int age; /*年龄*/ float score; /*成绩*/ s1,s2;,说明:定义省略了结构体名(student)。这种定义方式的特点是:不能在别处用来另行定义别的结构体变量,要想定义就得将“struct”这部分重新写。,7.1.2 结构体变量的定义(三种形式),7.1.3 结构体变量初始化和引用,结构体变量也可在定义的同时初始化,所赋初值按顺序放在一对花括号中。如:,1、结构体变量的初始化,struct student char no10; char name20; char sex; int age; float score; s1=“201001020”,”李航”,M,18,98.5;,结构体变量初始化时,C编译系统按每个成员在结构体中的顺序一一对应赋初值,不允许跳过前边的成员给后边的成员赋初值。,7.1.3 结构体变量初始化和引用,(1)结构体变量的常规引用(以结构体成员为单位引用) 结构体变量各成员的引用格式为: 结构体变量名.成员名 例如:s1. no、s1. name、s1.sex、s1.age、s1.score,2、结构体变量的引用,注意: “.”是C语言中的成员运算符。它对应的运算称为访问成员运算。 优先级为1级,结合方向为从左到右。 成员的数据类型就是说明结构体类型时对该成员规定的数据类型。,7.1.3 结构体变量初始化和引用,(2)对相同类型的结构体变量进行整体赋值操作 struct student char no10; char name20; char sex; int age; float score; s1=“201001020”,”李航”,M,18,98.5,s2; s2=s1;,2、结构体变量的引用,注意: 这种赋值方法很简单,但必须保证赋值号两边结构体变量的类型相同。,#include struct student char no10; char name20; char sex; int age; float score; ; main() struct student s1=“201001020“,“李航“,M,18,98.5; struct student s2; s2=s1; /* s1的所有成员值赋给s2 对应的成员*/ printf(“学号:%sn“,s2.no); /*输出s2各成员的值*/ printf(“姓名:%sn“,s2.name); printf(“性别:%cn“,s2.sex); printf(“年龄:%dn“,s2.age); printf(“成绩:%.1fn“,s2.score); ,运行结果如下: 学号:201001020 姓名:李航 性别:M 年龄:18 成绩:98.5,注意:结构体变量只允许整体赋值,其他操作如输入、输出、运算等必须通过引用结构体变量中的成员进行相应操作。,结构体数组是数组的一种,这种数组的元素类型是结构体类型。 在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体,如一个班的学生学籍信息表。,7.2 结构体数组,7.2.1结构体数组的定义,结构体数组的定义和结构体变量的定义一样,可直接套用。即先说明结构体类型,再定义结构体数组。,7.2 结构体数组,结构体数组的定义1: struct student char no10; char name20; char sex; int age; float score; s5;,结构体数组的定义2: struct student char no10; char name20; char sex; int age; float score; ; struct student s5;,7.2 结构体数组,结构体数组的初始化: struct student s5= “201001020”,”李航”,M,18,98.5; “201001021”,”王伟”,F,17,87; “201001022”,”刘辉”,F,18,68; “201001023”,”于晓丽”,M,19,93; “201001024”,”张娇”,M,18,85.5; ;,7.2.2结构体数组的初始化及引用,9.2 结构体数组,结构体数组的引用与结构体变量的引用一样。 格式: 结构体数组名下标.成员名 例如: s0.no,s0.name,s4.sex,s4.age,【例7-2】统计5个学生的不及格人数。 #include struct stu int no; char name20; float score; ; main() struct stu s5; /*定义struct stu类型的结构体数组s*/ int i,c=0; for(i=0;i5;i+) printf(“input name and score:“); scanf(“%s%f“,si.name, ,运行结果如下: input name and score:liu 78 input name and score:wang 53 input name and score:li 90 input name and score:zhao 86 input name and score:zhang 48 不及格人数:2,7.3 结构体指针,7.3.1结构体指针变量的定义与引用,结构体指针变量的定义格式如下: struct 结构体类型名 *结构体指针变量名; 例如: struct student *p; 【例7-3】利用结构体指针变量改写例7-1。,#include struct student char no10; char name20; char sex; int age; float score; ; main() struct student s1=“201001020“,“李航“,M,18,98.5; struct student s2,*p; p=,“-”运算符被称为指向成员运算符。它的优先级为第一级,结合规则从左到右。 一般形式为: 功能:访问结构体指针变量所指向的结构体数据的成员。 结构体指针变量-成员名 例如: p-sex等价于s2.sex p-age等价于s2.age。 如果有一个结构体变量s2和一个指向s2的结构体指针变量p,则访问s2的成员有三种方式: (1)s2.成员名 (2)(*p).成员名 (3)p-成员名,【例7-5】从键盘上输入年、月、日,计算出它是该年的第几天。 #include struct date int year; int month; int day; int yeardays; ; main() struct date y_m_d; void days(struct date *); printf(“请输入年月日n”);,7.3.2 以结构体指针作函数参数,scanf( “%d,%d,%d”,2011,6,13,7.4 共用体,共用体类型也是由不同数据类型的数据组成。共用体与结构体在很多方面都很相似,但有一个重大的区别,那就是它们使用内存的方式不同。,结构体和共用体的区别,结构体数据的各个成员占据各自的空间,它们同时存在于结构体数据的整体空间中,结构体数据的整体存储空间为各个成员所占空间之和。,共用体数据的各个成员使用共同的存储空间,在任一时刻这个存储空间都只能存放一个成员的数据,共用体数据的整体存储空间为其所有成员中占据空间最大的一个成员所占的空间。,如:struct student char name20; int old; char sex; char addr100;
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号