资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C语言程序设计,第8章 结构体与共用体,结构体和共用体,结构体类型和变量定义 结构体数组 结构体和函数 共用体 枚举类型 typedef语句,一个学生的信息有学号、姓名、性别、年龄、住址、成绩等。 一本图书的信息有分类编号、书名、作者、出版社、出版日期、价格、库存量等。 如何描述这些类型不同的相关数据?,?,信息管理,结构体一种构造类型数据 结构体由若干不同类型的数据项组成, 构成结构体的各个数据项称为结构体成员。,8.1 结构体类型定义 简单类型是由系统预定义的 如int、float、 char等 结构体类型是根据需要由程序员自行定义,因此在 使用之前必须先定义结构体类型,struct 结构体名 类型名 成员名; 类型名 成员名; . ;,结构体类型定义格式: struct 结构体类型标识符 结构体成员表; ;,例如学生类型的定义: struct student char num8; /* 学号是字符数组类型 */ char name30; /* 姓名是字符数组类型 */ char sex; /* 性别是字符型 */ int age; /* 年龄是整型 */ char addr60; /* 住址是字符数组类型 */ int score6; /* 成绩是整型数组类型 */ ;,先定义结构体类型,再定义结构体变量 一般形式:,struct 结构体名 类型名 成员名; 类型名 成员名; . ; struct 结构体名 变量名表列;,常用方法; 在该定义后的任意位置仍可用该结构体类型来定义其它变量; 适用于需要大量引用该结构体类型的情况; 可把通用的类型定义集中在一个单独的源文件中.,特点:,8.2 结构体变量定义,定义结构体类型的同时定义结构体变量 一般形式:,struct 结构体名 类型名 成员名; 类型名 成员名; . 变量名表列;,简略形式,类型定义和变量定义合在一起 适用于该结构体类型引用不太多的情况,特点:,直接定义结构体变量,无结构体名形式: 一般形式:,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,适用于一次性定义该结构体类型的场合 没有定义结构体类型名,所以不能在别处用它来定义其他结构体变量.,特点:,结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体类型定义可嵌套,例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;,变量的存储特点,结构体变量占字节数是各成员所占字节总和。,结构体变量的初始化:对结构体中的各成员变量赋初值 一般格式: 结构体类型名 结构体变量=初始化值列表;,struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; struct student stu2=113,“Zhang San”,W;,结构体变量的初始化:对结构体中的各成员变量赋初值 一般格式: 结构体类型名 结构体变量=初始化值列表;,说明,初始化值列表中初始化数据之间用逗号分隔。 初始化数据的个数一般与成员的个数相同,若小于成员数,则剩余的成员将被自动初始化为0。 初始化数据的类型要与相应成员变量的类型一致。 初始化时只能对整个结构体变量进行,不能仅对结构体类型中的某些成员进行初始化赋值。,结构体变量的引用对结构体变量成员的引用 在C语言程序中, 不允许对结构变量整体进行输入输出操作和除赋值外的各种运算,只能是对其成员进行此类操作。 引用结构体变量成员的一般形式: 结构体变量名 . 成员名,struct d_type int year; int month; int day; ; struct s_type char num7; char name21; char sex; struct d_type birthday; float score; char address31; ;,其中“.”是结构体成员运算符, 其优先级别最高, 结合性是自左至右。 结构体成员扮演的角色和同类型的普通变量完全一样。所以,结构体成员还可进行该成员类型允许的各种运算操作,说明:,对结构体变量整体的引用 对结构变量整体只能做赋值类的操作 可以相互赋值,但注意相互赋值的两个结构体变量必须是同一个结构体类型,s2=s1; s2.birthday=s1.birthday;,可作为函数的实参到形参的值传递、或函数返回值。,8.3 结构体数组 数组是由相同数据类型的元素组成的,当用相同类型的结构体作元素就可构成结构体数组。 虽然每个元素的内部含不同类型的成员,但从整体上看,每个元素的类型是相同的。 结构体数组的定义,先定义后使用,三种形式:,struct student int num; char name20; char sex; int age; ; struct student stu2;,结构体数组初始化 格式: 结构体类型名 结构体数组名 数组长度=初始化值列表; 注意: 一一对应 如果初始值的个数小于对应元素的成员个数,则剩余 成员将被初始化为默认值,struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19;,例 struct student int num; char name20; char sex; int age; stu =,;,例 struct int num; char name20; char sex; int age; stu =,;,结构体数组引用: 遵循数组元素、结构体变量的引用法则,一般形式: 结构体数组名下标 . 成员名,struct student int num; char name20; char sex; int age; str3;,说明: 可以将一个结构体数组元素赋值给同一结构体类型数组中另一个元素,或赋给同一类型的变量。 例:若数组s的元素类型与变量s0的类型为相同的结构体类型时,要交换两个数组元素,则: s0=si; si=sj; sj=s0; 不能把结构体数组元素整体直接进行输入或输出。,例8.2: 用结构体数组存储学生信息,每个学生有姓名、学号和成绩。从键盘按学号顺序输入N名学生信息,在按成绩从高到低的顺序输出各学生的全部信息。,分析: 1、结构体数组(成员变量:姓名、学号、成绩) 2、按成绩排序(一维数组排序选择排序),#define N 3 struct stud_type char name10; int num; int score; ; struct stud_type sN;,8.4 结构体和函数 结构体变量作函数参数 结构体变量成员作函数参数 结构体变量中的所有成员都可作为函数参数,struct stud_type char name10; long num; char sex; s1;,现将结构体变量s1的成员分别传递给函数 f1,f2,f3: f1(s1.name); f2(s1.num); f3(s1.sex); 若需要将成员地址传递给函数, 则加“ name是数组,不加“&”。 将结构体变量s1整体作实参传递给函数 f() : f(s1),结构体变量整体作函数参数 老版本的C系统不允许用结构体变量整体作函数参数,只允许用指向结构体变量的指针作函数参数(参见指针章), 传递的是结构体变量的首地址。 而ANSI C取消了这一限制, 规定按值传递方式。 在函数调用时,系统为形参结构体变量分配存储空间,并从相应的实参结构体变量中取得各成员的值,若对形参中结构体变量各成员值进行修改,并不能修改实参结构体变量各成员的值。 注意,实参和形参结构体变量类型应当完全一致。 结构体数组元素也可作为函数的实参进行整体值传递,形参是与数组元素同类型的结构体变量。,例8.2: 用结构体数组存储学生信息,每个学生有姓名、学号和成绩。从键盘按学号顺序输入N名学生信息,在按成绩从高到低的顺序输出各学生的全部信息。,分析: 1、结构体数组(成员变量:姓名、学号、成绩) 2、按成绩排序(一维数组排序选择排序),#define N 3 struct stud_type char name10; int num; int score; ; struct stud_type sN;,#include #define N 3 struct stud_type char name10; int num; int score; ; struct stud_type sN; void sort(struct stud_type s ); main() int i; printf(“ninput %d studentsnname No Score n“,N); for(i=0;iN;i+) scanf (“%s%d%d“,si.name, ,void 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.scorestuj.score) k=j; t=stui; stui=stuk; stuk=t; ,返回值为结构体类型的函数 与其他类型一样,结构体类型也可作为函数的返回值类型。 一般形式: 结构体类型名 函数名(形参表); 说明: 用结构体类型定义的函数可以将被调用函数的结构体类型值返回到主调函数。,例8.4 在main函数中定义一个结构体数组,多次调用input函数输入各学生的信息,返回值赋给结构体数组元素,再多次调用print函数输出。,#include “stdio.h“ struct st_type char name10; int num; char sex; ; struct st_type input() struct st_type s0; printf(“please input the name: “); gets(s0.name); printf(“please input the no and sex: “); scanf(“%d%*c%c“, ,main() int i; struct st_type s3; for(i=0;i2;i+) si=input(); for(i=0;i2;i+) print(si); ,结构体类型解决了如何描述一个逻辑上相关,但数据类型不同的一组分量的集合。 在需要节省内存
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号