[工学]C语言程序设计 用户自己建立数据类型.ppt
第9章 用户自己建立数据类型,北京航空航天大学 交通科学与工程学院 徐国艳,C 语言程序设计,2019/12/14,2,本章主要内容,9.1 结构体 9.2 结构体变量的定义 9.3 结构体变量的引用 9.4 结构体变量的初始化 9.5 结构体数组 9.6 结构体和指针 9.7 共用体 9.8 用typedef定义类型,2019/12/14,3,9.1 结构体 结构体是一种构造数据类型 用途把不同类型的数据组合成一个整体-自定义数据类型 结构体类型定义,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ;,成员类型可以是 基本型或构造型,struct是关键字, 不能省略,合法标识符 可省无名结构体,2019/12/14,4,例 struct student int num; char name20; char sex; int age; float score; char addr30; ;,结构体类型定义描述结构 的组织形式,不分配内存,结构体类型定义的作用域,2019/12/14,5,例 struct student int num; char name20; char sex; int age; float score; char addr30 struct student stu1,stu2;,9.2 结构体变量的定义 1.先定义结构体类型,再定义结构体变量 一般形式,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; .; struct 结构体名 变量名表列;,2019/12/14,6,例 define STUDENT struct student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2;,2019/12/14,7,2.定义结构体类型的同时定义结构体变量 一般形式,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,2019/12/14,8,3.直接定义结构体变量 一般形式,struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列;,例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2;,用无名结构体直接定义 变量只能一次,2019/12/14,9,4.说明 结构体类型与结构体变量概念不同 类型不分配内存; 变量分配内存 类型不能赋值、存取、运算; 变量可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆 结构体类型及变量的作用域与生存期,2019/12/14,10,2019/12/14,11,9.3 结构体变量的引用 1.引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用,成员分量运算符 优先级 1 结合性从左向右,引用方式 结构体变量名.成员名,2019/12/14,12,2019/12/14,13,2019/12/14,14,9.4 结构体变量的初始化 1.形式一,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 结构体变量初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1112,“Wang Lin”,M,19, “200 Beijing Road”;,2019/12/14,15,2.形式二,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 结构体变量初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; stu1112,“Wang Lin”,M,19, “200 Beijing Road”;,2019/12/14,16,3.形式三,struct 类型标识符 成员名; 类型标识符 成员名; . 结构体变量初始数据;,例 struct int num; char name20; char sex; int age; char addr30; stu1112,“Wang Lin”,M,19, “200 Beijing Road”;,2019/12/14,17,9.5 结构体数组 1.结构体数组的定义 三种形式,形式一 struct student int num; char name20; char sex; int age; ; struct student stu2;,2019/12/14,18,形式二 struct student int num; char name20; char sex; int age; stu2;,形式三 struct int num; char name20; char sex; int age; stu2;,2019/12/14,19,2.结构体数组初始化,2019/12/14,20,顺序初始化 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;,2019/12/14,21,例 struct int num; char name20; char sex; int age; stu ;,例 struct student int num; char name20; char sex; int age; stu ;,2019/12/14,22,3.结构体数组引用,引用方式 结构体数组名下标.成员名,2019/12/14,23,例 统计候选人选票,include include struct person char name20; int count; leader3“Li”,0,“Zhang”,0,”Wang“,0; void main int i,j; char leader_name20; fori1;i10;i scanf“s“,leader_name; forj0;j3;j ifstrcmpleader_name,leaderj.name0 leaderj.count; fori0;i3;i printf“5sdn“,leaderi.name,leaderi.count; ,2019/12/14,24,9.6 结构体和指针 1.指向结构体变量的指针 定义形式struct 结构体名 *结构体指针名; 例 struct student *p;,存放结构体变量在内存的起始地址,2019/12/14,25,使用结构体指针变量引用成员形式,指向运算符 优先级 1 结合方向从左向右,例 int n; int *p n10,2019/12/14,26,void main struct student long int num; char name20; char sex; float score; stu_1,*p; p ,例 指向结构体的指针变量,2019/12/14,27,1.指向结构体数组的指针,例 指向结构体数组的指针,struct student int num; char name20; char sex; int age; stu310101,“Li Lin“,M,18, 10102,“Zhang Fun“,M,19, 10104,“Wang Min“,F,20; main struct student *p; forpstu;pnum,p-name,p-sex,p-age; ,2019/12/14,28,2.用指向结构体的指针作函数参数 用结构体变量的成员作参数值传递 用指向结构体变量或数组的指针作参数地址传递 用结构体变量作参数多值传递,效率低,2019/12/14,29,struct data int a, b, c; ; void main void funcstruct data; struct data arg; arg.a27; arg.b3; arg.carg.aarg.b; printf“arg.ad arg.bd arg.cdn“,arg.a,arg.b,arg.c; printf“Call Funcn“; funcarg; printf“arg.ad arg.bd arg.cdn“,arg.a,arg.b,arg.c; void funcstruct data parm printf“parm.ad parm.bd parm.cdn“,parm.a,parm.b,parm.c; printf“Process.n“; parm.a18; parm.b5; parm.cparm.a*parm.b; printf“parm.ad parm.bd parm.cdn“,parm.a,parm.b,parm.c; printf“Return.n“; ,例 用结构体变量作函数参数,2019/12/14,30,struct data int a, b, c; ; main void funcstruct data *parm; struct data arg; arg.a27; arg.b3; arg.carg.aarg.b; printf“arg.ad arg.bd arg.cdn“,arg.a,arg.b,arg.c; printf“Call Funcn“; func ,例 用结构体指针变量作函数参数,2019/12/14,31,9.7 共用体 构造数据类型,也叫联合体 用途使几个不同类型的变量共占一段内存相互覆盖 1.共用体类型定义 定义形式,union 共用体名 类型标识符 成员名; 类型标识符 成员名; . ;,例 union data int i; char ch; float f; ;,类型定义不分配内存,2019/12/14,32,形式一 union data int i; char ch; float f; a,b;,形式二 union data int i; char ch; float f; ; union data a,b,c,*p,d3;,形式三 union int i; char ch; float f; a,b,c;,1.共用体变量的定义,共用体变量定义分配内存, 长度最长成员所占字节数,共用体变量任何时刻 只有一个成员存在,2019/12/14,33,2.共用体变量引用 引用方式,2019/12/14,34,例 a.i1; a.cha; a.f1.5; printf“d”,a.i; 编译通过,运行结果不对,引用规则 不能引用共用体变量,只能引用其成员,共用体变量中起作用的成员是最后一次存放的成员,例 union int i; char ch; float f; a; a1; ,2019/12/14,35,不能在定义共用体变量时初始化,例 union int i; char ch; float f; a1,a,1.5; ,可以用一个共用体变量为另一个变量赋值,例 float x; union int i; char ch; float f; a,b; a.i1; a.cha; a.f1.5; ba; xa.f; ,2019/12/14,36,3.结构体与共用体 区别 存储方式不同,联系 两者可相互嵌套,2019/12/14,37,例 结构体中嵌套共用体,struct int num; char name10; char sex; char job; union int class; char position10; category; person2;,2019/12/14,38,9.8 用typedef定义类型 功能用自定义名字为已有数据类型命名 类型定义简单形式typedef type name;,例 typedef int INTEGER;,类型定义语句关键字,已有数据类型名,用户定义的类型名,例 typedef float REAL;,类型定义后,与已有类型一样使用,2019/12/14,39,例 INTEGER a,b,c; REAL f1,f2;,说明 1.typedef 没有创造新数据类型 2.typedef 是定义类型,不能定义变量 3.typedef 与 define 不同,define typedef 预编译时处理 编译时处理 简单字符置换 为已有类型命名,2019/12/14,40,3.typedef定义类型步骤 按定义变量方法先写出定义体 如 int i; 将变量名换成新类型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新类型名定义变量 如 INTEGER i,j;,例 定义数组类型 int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,c;, int a100,b100,c100;,4.类型定义可嵌套,2019/12/14,41,例 定义指针类型 char *str; char *STRING; typedef char *STRING; STRING p,s10;, char *p; char *s10;,2019/12/14,42,例 定义函数指针类型 int *p; int *POWER; typedef int *POWER; POWER p1,p2;, int *p1,*p2;,2019/12/14,43,例 定义结构体类型 typedef struct date int month; int day; int year; DATE;,例 定义结构体类型 struct date int month; int day; int year; DATE;,例 定义结构体类型 struct date int month; int day; int year; d;,2019/12/14,44,2019/12/14,45,2019/12/14,46,作业,P330 3 6,