内容正文:
C语言程序设计案例教程第8章 结构体、共同体和编译预处理
第 8 章 结 构体、 共同体 和编 译预 处理
一 个 C 语 言 程 序 除 了 要 求 可 以 实 现 所 需 的 功 能 外 , 要 求 程 序 结 构 清 晰 、 洁 易 读 高 效 、还简
占内存空间小和通用性强等。本章介绍的结构体、共同体和编译预处理等内容,可以帮助读
者进一步优化程序,提高程序的执行效率。
8.1 结 构 体
前面介绍过的数据类型都是基本类型,它们都是具有相同数据类型的数据集合,尽管这
些数据类型解决了一些实际问题,但只有这些基本数据类型还是不够的,有时还需要将不同
类型的数据组合在一起,构成一个复杂的数据结构,从不同方面对数据进行描述。本节介绍
的结构体和下一节要介绍的共用体等就是具有更强的表现力的复杂数据类型。
8.1.1
结构体的定义
现 实 生 活 中 的 很 多 数 据 是 以 记 录 的 形 式 来 表 现 的 , 例 如 下 面 的 表 811 中 的 学 生 成 绩 和
表 812 中 的 学 生 通 讯 录 。
表 8-1-1
姓名
吴果俊
李华军
王美棋
张可
…
胡萍
语文
78
87
65
73
…
68
数学
62
73
85
75
…
82
学生学习成绩表
英语
67
86
93
77
…
81
平均成绩
69
82
83
75
…
77
总成绩
207
246
243
225
…
231
表 811 中 , 每 一 行 称 为 一 条 记 录 , 记 录 了 一 个 学 生 的 学 习 成 绩 信 息 , 在 进 行 信 息 处 理
时 ,通 需 要 以 一 条 记 录 为 单 位 进 行 ,而 每 一 条 记 录 中 的 数 据 既 有 整 型 数 据 ,也 有 字 符 型 数 据 ,
如 果 使 用 基 本 数 据 类 型 和 数 组( 数 组 的 各 个 元 素 都 是 相 同 的 数 据 类 型 ),是 无 法 将 同 一 个 人 的
数据放在一个对象中进行处理的。
表 8-1-2
学号
000001
000002
000003
000004
…
000038
姓名
吴果俊
李华军
王美棋
张可
…
胡萍
性别
男
女
女
男
…
女
学生通讯录表
电话号码
81477288
68981234
87902345
89006666
…
66889911
通讯地址
北 京 广 外 红 莲 小 区 15 号
北 京 朝 阳 雅 筑 15 号 楼 2001
北京市海淀区康庄打到 8 号
北 京 新 港 状 元 15 号 楼 601
…
北 京 方 庄 12 号 楼 1 单 元 203
表 812 中 , 每 一 行 表 示 一 个 学 生 的 通 讯 信 息 , 这 些 信 息 数 据 同 样 也 不 是 单 一 的 数 据 类
型。在一条记录中,既有整型数据,又有字符串数据,是由几种不同类型的数据构成的。它
们也不能基本数据类型和数组来表示,也无法处理这种复杂的数据。
190
C 语 言 的 结 构 体 可 以 将 几 种 不 同 类 型 的 数 据 组 合 到 一 起 。
1. 定 义 结 构 体
结构体是一种复合的数据类型,它允许用其它数据类型构成一个结构类型,而一个结构
类型变量内的所有数据可以作为一个整体进行处理。与数组类似,一个结构体也是若干数据
项( 也 称 为 成 员 或 域 )的 集 合 ,但 与 数 组 不 同 ,数 组 中 的 所 有 元 素 都 只 能 定 义 为 同 一 类 型 的 ,
而结构体中的数据项具有不同的类型。结构体的定义格式和说明介绍如下。
【 格 式 】 struct 结 构 体 标 识 名
{
类型
类型
…
};
【 说 明 】 键 字 struct 用 于 定 义 结 构 体 类 型 , 构 体 成 员 的 类 型 可 以 是 基 本 数 据 类 型 如关结(
int, char) ,也 可 以 是 数 组 、 指 针 或 已 经 定 义 的 结 构 体 等 数 据 类 型 , 在 定 义 的 结 尾 以 分 号 表
示结束。有了结构体,前面的学生成绩记录可以用结构体方法,按如下所示定义。
struct student/*定 义 学 生 成 绩 结 构 体 类 型 */
{
char name[8];/* 姓 名 */
int chinese;/* 语 文 */
int math;/* 数 学 */
int eng;/* 英 语 */
int aver;/*平 均 成 绩 */
int count;/*总 成 绩 */
};
struct txl/*定