七、C语言结构体与共同体
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类型2有效
类型1有效
3) 成员名可与程序中其它量同名,且互不干扰;
6
4) 成员的类型也可是已定义过的结构体类型; 如:struct date /*该结构体有3个成员*/ { int m; int d; int y; }; struct student /*该结构体有6个成员*/ { int num; char name[20]; char sex; struct date birthday; /*成员类型:结构体*/ float score; char tel[15]; }; 5) 定义结构体类型仅仅声明了一种数据结构,编译系统是不会为类型分配存储空 间的;此时在有效范围,可用已定义的结构体类型去定义结构体变量或数组,编 译系统将为结构体变量或数组分配存储空间;
成员tel的指针:stu1.tel
13
score tel
4 15
定义结构体变量存放两位学生的基本情况,计算平均成绩,并以大写形式输出 name成员. stu1={109031,"Li Feng",89.0},stu2={109032,"Wang Li",71.0}; 1,定义学生结构体,并存放两学生的基本情况:
num name sex m birthday d y score tel
4 20 4 12 4 16
stu1 共60字节
成员
10
成员字节
数组引用的单位是元素,而不能引用整个数组. 结构体变量引用的单位则是成员,同样结构体变量不能被整体引用. 结构体变量各成员的引用 struct date { int m; 引用形式: 引用形式:结构体变量名 . 成员名 int d; 其中: 其中:成员运算符' . ' : 一级,自左而右; int y; 如:按以上定义 }; stu1.num 引用结构体变量stu1的num成员; struct student{ stu1.name 引用stu1的name成员(字符指针); int num; char name[20]; stu1.name[i] 引用name成员的第i个元素; char sex; stu1.birthday.y 只能对最低级成员进行引用;
1
定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 结构体数组 指针与结构体 用指针处理链表 用typedef定义类型 定义类型
2
数组:同类型数据的集合; C构造类型 结构体:不同类型数据的集合; 共同体:不同类型的量共用存储单元.
应用示例: 编程处理若干学生的基本情况;其中每个学生的基本情况由若干项组成,而各项的 类型可能相同或不同. 项目: 学号 数据:
8
结构体变量的存储结构:各成员按定义顺序连续存储;变量stu1存储字节数: 4+20+1+12+4+15=56 如: struct student { int num; char name[20]; char sex; char birthday[12]; float score; char tel[15]; } stu1, stu2;
12
注:&优先级为2级,低于.和[ ]; 图示: 图示:
变量stu1的指针:&stu1 num成员指针:&stu1. num name成员指针:stu1. name name第i个元素指针:&stu1. name[i]
stu1
num name sex m 4 20 1 6
┇
birthday d 最低级成员y的指针:&stu1.birthday.y y
struct date birthday; float score; char tel[15]; } stu1;
11
【例】按以上定义输入 scanf("%d", &stu1.num); /* .高于&*/ scanf("%d,%d,%d", &stu1.birthday.m,&stu1.birthday.d,&stu1.birthday.y); 0110234 ↙ (不保存前导0) 5,24,1981 ↙ 【例】gets(stu1.name); /*成员name的指针*/ scanf("%s", stu1.tel); /*成员tel的指针*/ Li Feng ↙ 021-8482500 ↙ 【例】按以上定义输出 printf("munber:%07ld\n", stu1.num); /*前导0*/ printf("%d,%d,%d", stu1.birthday.y, stu1.birthday.m, stu1.birthday.d); printf("name:%s\n", stu1.name); //或: for(i=0; stu1.name[i]!=0; i++) /*数组成员输出*/ printf("%c", stu1.name[i]); //与[ ]运算符同为一级,自左而右运算.
5
1) 结构体不可能有统一的结构,因此一个结构体的成员数目,各成员的类型必须 依据具体情况由用户自己定义; 2) 一个C程序可定义多个结构体类型;定义的位置可在函数之内,也可在函数之 外;位置决定其有效范围;如: 结构体类型1定义; main( ) { 结构体类型2定义; ┅; } fun1(┅) { ┅; }
4
定义可表示学生基本情况的结构体类型.
项目: 学号 姓名 性别 出生日期 成绩
M 1981源自文库5.4
电话号码
数据: 010510 Li Feng 类型: 整型/字串 字串
680 029-8482500
字符
字串
整型
字串
struct student /*特定结构体类型标识*/ { int num; char name[20]; char sex; char birthday[12]; float score; char tel[15]; }; /*该类型共有6个成员*/
stu1.name[i]=stu1.name[i]-32; } }
}
14
15
stu1
&stu1 99001
p
一个结构体变量的指针是该变量存储区域 的起始地址,它指向结构体这个整体.
name[0] name[1] ┇ name[19]
89.5
在程序中可定义一个指向同类型结构体的指针变量, (*p).num表示访问p所指向变量的num成员; 并将该指针变量指向某结构体变量,之后便可利用 其中:*号为2级,括号可保证先使p与*结合. 指针变量访问各成员. ->称为指向成员运算符;1级,自左而右; (*p).num p->num stu1.num p->num中->代替了*和. 运算符,看着更直观;如: p->score:访问p所指向变量的score成员; p->name[i]:访问p指向变量的name成员第i个元素.
7
三种定义方法: 三种定义方法: 1) 先定义结构体类型,再用类型标识去定义变量 struct student stu1, stu2; struct student是已定义的结构体类型标识符; stu1,stu2是所定义的结构体变量;编译时将为结构体变量分配各自的存储空 间; 2) 定义类型的同时定义变量 struct student { …; /*各成员的定义*/ …; } stu1, stu2; 3) 不使用结构体名,定义类型的同时定义变量 struct /*无结构体名*/ { …; …; } stu1, stu2; 说明: 说明: 结构体变量可以是局部的或全局的. 结构体变量存储空间大小为各成员长度之和;
19
用结构体方法设计一软件计时器,用字符显示时:分:秒
20
21
【例】设计一软件计时器,用字符显示时:分:秒 struct time_stru /*该类型全局有效*/ { int h, m, s;}; /*三个成员用一个标识符*/ main( ) { void updata(struct time_stru *t); void display(struct time_stru *t); struct time_stru time; /*定义结构体变量*/ /* */ time.h=time.m=time.s=0; clrscr( ); while(!kbhit( )) /*击键测试*/ { updata(&time); display(&time); } } 22
16
此时实参与形参对应关系为:
实参
结构体变量.成员 成员的值 基本类型变量 成员 数组成员的指针 数组名 结构体变量的指针 结构体变量名
形参
与成员同类型变量 同类型形参数组 结构体指针变量 同类型结构体变量
结构体变量的指针 各成员值对应传递
17
【例】一结构体类型,可表示学号,姓名,三门课成绩及平均成绩, 编程对两位学生的成绩求个人平均分,输出所有数据项. 要求: 要求:1) 分别用结构体变量stu1,stu2存储数据; 2) 由函数aver实现平均分计算; num 3) 由函数pfun实现输出;
210510
姓名
Li Feng
性别 出生日期
M 1984.5.4
成绩
680
电话号码
029-8482500
类型: 整型/字串
字串
字符 字串
整型
字串
该例中构成每个学生基本情况的数据类型不同,可采用结构体这种数据类型实现.
3
定义一般形式: 定义一般形式: struct 结构体名{ 类型标识符 成员名1; 类型标识符 成员名2; ┇ 类型标识符 成员名n; }; 其中: 其中: 1) struct 结构体名 结构体名组成具体的结构体类型标识符,可用这个结构体类型标识符 去定义变量等对象; 2) 结构体名,成员名应符合标识符命名规则; 3) 类型标识符确定各成员类型;
stu1
num name sex birthday score 4 20 1 12 4 15
共56字节
课堂练习:写程序求student 的长度.(structLength.c)
tel
成员
9
成员字节
有以下结构体,求结构体变量 stu1占用的内存数量: struct date { int m; int d; int y; }; struct student{ int num; char name[20]; char sex; struct date birthday; float score; char tel[15]; } stu1;
99001 Li Hong
函数间信息传递: 函数间信息传递:
结构体变量的指针
name score[0] score[1] score[2] aver
主 函 数
无返回值
aver
89.0 76.0 90.0 0
12byte
结构体变量各成员值
无返回值
18
pfun
程序:student3.c
关键字typedef可用来为类型标识符建立一个别名,这个别名同样可用于变量,数组,函 数等对象的声明. 使用一般形式: 使用一般形式:typedef 原类型名 新类型名; 其中: 其中:原类型名可以是标准的或用户定义的; 新类型名即为别名,别名通常大写; 意义: 意义: 1) 用较短的别名代替用户定义的结构体类型名; 2) 使程序具有更好的通用性. 如:typedef float REAL; /*定义类型别名*/ REAL x, y; /*用类型别名定义变量*/ 如:typedef unsigned long ULONG; ULONG a, b; 如: typedef struct { long num; char name[20]; floag score[4]; } STRSTU; /*结构体类型的别名*/ STRSTU s1,s2,stu[10]; /*定义变量,数组*/ void fun1(STRSTU *); /*声明函数*/
#include "stdio.h" struct student{ /*定义全局结构体类型*/ int num; char name[20]; float score; }; main(){ /*按成员顺序给出初值*/ struct student stu1={109031,"Li Feng",89.0},stu2={109032,"Wang Li",71.0}; float aver; //求平均分 int i; //循环控制变量I aver=(stu1.score+stu2.score)/2; for(i=0; stu1.name[i]!='\0';i++){ if(stu1.name[i]>'a'&&stu1.name[i]<'z'){