当前位置:首页 >> 其它技巧 >>

幻灯片-C语言程序设计视频教程-徐红波-第11章_图文

C程序设计
讲师:徐红波 Email: x_h_b@tom.com

第11章 结构体与共用体 11.1 概述
迄今为止,已介绍了基本类型(或称简单类型)的变 量(如整型、实型、字符型变量等),也介绍了一种构造 类型数据--数组,数组中的各元素是属于同一个类型的。 但是只有这些数据类型是不够的。有时需要将不同 类型的数据组合成一个有机的整体,以便于引用。这些 组合在一个整体中的数据是相互联系的。应当把它们组 织成一个组合项,在一个组合项中包含若干个类型不同 的数据项(当然也可以相同)。C语言允许用户自己指定 这样一种数据结构,它称为结构体。它相当于其他高级 语言中的“记录”。

num

name

sex

age

score

addr

10010

Li Fun

M

18

87.5

Beijing

struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }

声明一个结构体类型的一般形式为 struct 结构体名 { 成员表列; }; “结构体名”用作结构体类型的标志,它又称“结构体标 记”。大括弧内是该结构体中的各个成员,由它们组成一个结构 体。对各成员都应进行类型声明,即 类型名 成员名; 也可以把“成员表列”称为“域表”。每一个成员也称为结 构体中的一个域。成员名定名规则与变量名相同。

11.2 定义结构体类型变量的方法
前面只是指定了一个结构体类型,它相当于一个模 型,但其中并无具体数据,系统对之也不分配实际内存 单元。为了能在程序中使用结构体类型的数据,应当定 义结构体类型的变量,并在其中存放具体的数据。可以 采取以下三种方法定义结构体类型变量。 1、先声明结构体类型再定义变量名 2、在声明类型的同时定义变量 3、直接定义结构体类型变量

关于结构体类型,有几点要说明:
(1)类型与变量是不同的概念,不要混同。只能对变量赋 值、存取或运算,而不能对一个类型赋值、存取或运算。 在编译时,对类型是不分配空间的,只对变量分配空间。 (2)对结构体中的成员(即“域”),可以单独使用,它的 作用与地位相当于普通变量。 (3)成员也可以是一个结构体变量。 (4)成员名可以与程序中的变量名相同,二者不代表同一 对象。

11.3 结构体变量的引用
在定义了结构体变量以后,当然可以引用这个变量。但应 遵守以下规则: (1)不能将一个结构体变量作为一个整体进行输入和输出。 (2)如果成员本身又属一个结构体类型,则要用若干个成员运算 符,一级一级地找到最低的一级的成员。只能对最低级的成员 进行赋值或存取以及运算。 (3)对结构体变量的成员可以像普通变量一样进行各种运算(根据 其类型决定可以进行的运算)。 (4)可以引用结构体变量成员的地址,也可以引用结构体变量的 地址。

11.4 结构体变量的初始化
和其他类型变量一样,对结构体变量可以在 定义时指定初始值。 [例11.1]对结构体变量初始化

11.5 结构体数组
一个结构体变量中可以存放一组数据(如一个学生的 学号、姓名、成绩等数据)。如果有10个学生的数据需 要参加运算,显然应该用数组,这就是结构体数组。结 构体数组与以前介绍过的数值型数组不同之处在于每个 数组元素都是一个结构体类型的数据,它们都分别包括 各个成员(分量)项。

11.5.1 定义结构体数组
和定义结构体变量的方法相仿,只需说明其 为数组即可。

11.5.2 结构体数组的初始化
与其他类型的数组一样,对结构体数组可以 初始化。

11.5.3 结构体数组应用举例
[例11.2]对候选人得票的统计程序。设有3个候选 人,每次输入一个得票的候选人的名字,要求最 后输出各人得票结果

11.6 指向结构体类型数据的指针
一个结构体变量的指针就是该变量所占据的内存段 的起始地址。可以设一个指针变量,用来指向一个结构 体变量,此时该指针变量的值是结构体变量的起始地址。 指针变量也可以用来指向结构体数组的元素。

11.6.1 指向结构体变量的指针
[例11.3]指向结构体变量的指针的应用 为了使用方便和使之直观,可以把(*p).num改用p>num来代替,它表示p所指向的结构变量中的num成员。 也就是说,以下三种形式等价: (1)结构体变量.成员名 (2)(*p).成员名 (3)p->成员名 其中->称为指向运算符。

11.6.2 指向结构体数组的指针
已经介绍过可以使用指向数组或数组元素的指针和 指针变量。同样,对结构体数组及其元素也可以用指针 或指针变量来指向。 [例11.4]指向结构体数组的指针的应用

11.6.3 用结构体变量和指向结构体的指针作函数参数
将一个结构体变量的值传递给另一个函数,有3个方法: (1)用结构体变量的成员作参数。用法和用普通变量作实参是一 样的,属于“值传递”方式。 (2)用结构体变量作实参。用结构体变量作实参时,采取的也是 “值传递”的方式,将结构体变量所占的内存单元的内容全部顺 序传递给形参,形参也必须是同类型的结构体变量。在函数调用 期间形参也要占用内存单元。这种传递方式在空间和时间上开销 较大,如果结构体的规模很大时,开销是很可观的。 (3)用指向结构体变量(或数组)的指针作实参,将结构体变量(数 组)的地址传给形参。

[例11.5]有一个结构体变量stu,内含学生学号、 姓名和3门课的成绩。要求在main函数中赋以值, 在另一函数print中将它们打印输出 [例11.6]将上题改用指向结构体变量的指针作实 参

11.7 用指针处理链表 11.7.1 链表概述
链表是一种常见的重要的数据结构。它是动 态地进行存储分配的一种结构。

11.7.2 简单链表
[例11.7]建立一个简单链表,它由3个学生数据的 结点组成。输出各节点中的数据

11.7.3 处理动态链表所需的函数
链表结构是动态地分配存储的,即在需要时才开辟 一个结点的存储单元。 1、malloc函数:void * malloc(unsigned int size); 2 calloc 2、calloc函数:void * calloc(unsigned n, unsigned size); void 3、free函数:void free(void * p);

11.7.4 建立动态链表
所谓建立动态链表是指在程序执行过程中从无到有 地建立起一个链表,即一个一个地开辟结点和输入各结 点数据,并建立起前后相链的关系。 [例11.8]写函数建立一个有3名学生数据的单向动态链表

11.7.5 输出链表
将链表中各结点的数据依次输出。首先要知道链表 第一个结点的地址,也就是要知道head的值。然后设一 个指针变量p,先指向第一个结点,输出p所指的结点, 然后使p后移一个结点,再输出。直到链表的尾结点。 [ 11.9] [例11.9]编写一个输出链表的函数print print

11.7.6 对链表的删除操作
从一个动态链表中删去一个结点,并不是真正从内 存中把它抹掉,而是把它从链表中分离开来,只要撤销 原来的链接关系即可。 [例11.10]写一函数以删除动态链表中指定的结点

11.7.7 对链表的插入操作
对链表的插入是将一个结点插入到一个已有 的链表中。 [例11.11]插入结点的函数insert

11.7.8 对链表的综合操作
将以上建立、输出、删除、插入的函数组织 在一个C程序中。

11.8 共用体 11.8.1 共用体的概念
有时需要使几种不同类型的变量存放到同一段内存 单元中。例如,可把一个整型变量、一个字符型变量、 一个实型变量放在同一地址开始的内存单元中。以上3 个变量在内存中占的字节数不同,但都从同一地址开始。 也就是使用覆盖技术,几个变量互相覆盖。这种使几个 不同的变量共占同一段内存的结构,称为“共用体”类 型的结构。 定义共用体类型变量的一般形式为 union 共用体名 { 成员表列 } 变量表列;

11.8.2 共用体变量的引用方式
只有先定义了共用体变量才能引用它。而且不能引 用共用体变量,而只能引用共用体变量中的成员。

11.8.3 共用体类型数据的特点
(1)同一个内存段可以用来存放几种不同类型的成员,但 在每一瞬时只能存放其中一种,而不是同时存放几种。 也就是说,每一瞬时只有一个成员起作用,其他成员不 起作用,即不是同时都存在和起作用。 (2)共用体变量中起作用的成员是最后一次存放的成员, 在存入一个新的成员后原有的成员就失去作用。 (3)共用体变量的地址和它的各成员的地址都是同一地址。

(4)不能对共用体变量名赋值,也不能企图引用变量名来 得到一个值,又不能在定义共用体变量时对它初始化。 (5)不能把共用体变量作为函数参数,也不能使函数带回 共用体变量,但可以使用指向共用体变量的指针。 (6)共用体类型可以出现在结构体类型定义中,也可以定 义共用体数组。反之,结构体也可以出现在共用体类型 定义中,数组也可以作为共用体的成员。

[例11.13]设有若干个人员的数据,其中有学生和教师。 学生的数据中包括:姓名、学号、性别、职业、班级。 教师的数据包括:姓名、号码、性别、职业、职务。 可以看出,学生和教师所包含的数据是不同的。现要 求把它们放在同一表格中 num 101 102 name Li Wang sex f m jog s t class或position 501 prof

11.9 枚举类型
如果一个变量只有几种可能的值,可以定义为枚举 类型。所谓“枚举”是指将变量的值一一列举出来,变 量的值只限于列举出来的值的范围内。

说明:
(1)在C编译中,对枚举元素按常量处理,故称枚举常量。 它们不是变量,不能对它们赋值。 (2)枚举元素作为常量,它们是有值的,C语言编译按定 义时的顺序使它们的值为0,1,2,…。 (3)枚举值可以用来做判断比较。 (4)一个整数不能直接赋给一个枚举变量。 [例11.14]口袋中有红、黄、蓝、白、黑5种颜色的球各 一个。每次从口袋中先后取出3个球,问得到3种不同色 的球的可能取法,输出每种排列的情况

11.10 用typedef定义类型
除了可以直接使用C提供的标准类型名(如int、char、 float、double、long等)和自己声明的结构体、共用体、 指针、枚举类型外,还可以用typedef声明新的类型名来 代替已有的类型名。

说明:
(1)用typedef可以声明各种类型名,但不能用来定义变量。 用typedef可以声明数组类型、字符串类型,使用比较方 便。 (2)用typedef只是对已经存在的类型增加一个类型名,而 没有创造新的类型。 (3)typedef与#define有相似之处。 (4)当不同源文件中用到同一类型数据时,常用typedef声 明一些数据类型,把它们单独放在一个文件中,然后再 需要用到它们的文件中用#include命令把它们包含进来。 (5)使用typedef用利于程序的通用与移植。

习题
11.3 编写一个函数print,打印一个学生的成绩数组,该 数组中有5个学生的数据记录,每个记录包括num、 name、score[3],用主函数输入这些记录,用print函数 输出这些记录。 11.4 在上题的基础上,编写一个函数input,用来输入5 个学生的数据记录。 11.6 编写一个函数new,对n个字符开辟连续的存储空间, 此函数应返回一个指针(地址),指向字符串开始的空间。 new(n)表示分配n个字节的内存空间。 11.7 写一函数free,将上题用new函数占的空间释放。 Free(p)表示将p(地址)指向的单元以后的内存段释放。 11.8 已有a、b两个链表,每个链表中的结点包括学号、 成绩。要求把两个链表合并,按学号升序排列。


相关文章:
幻灯片-C语言程序设计视频教程-徐红波-第11章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第11章 - C程序设计 讲师:徐红波
幻灯片-C语言程序设计视频教程-徐红波-第13章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第13_工学_高等教育_教育专区。C程
幻灯片-C语言程序设计视频教程-徐红波-第10章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第10_工学_高等教育_教育专区。C程
幻灯片-C语言程序设计视频教程-徐红波-第2章17913388_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第2章17913388 - C程序设计
幻灯片-C语言程序设计视频教程-徐红波-第9章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第9_其它技巧_PPT制作技巧_实用文
幻灯片-C语言程序设计视频教程-徐红波-第3章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第3章 - C程序设计 讲师:徐红波 E
幻灯片-C语言程序设计视频教程-徐红波-第1章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第1章 - C程序设计 讲师:徐红波 E
幻灯片-C语言程序设计视频教程-徐红波-第3_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第3 - C程序设计 讲师:徐红波 Em
幻灯片-C语言程序设计视频教程-徐红波-第5章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第5_IT/计算机_专业资料。C程序设
幻灯片-C语言程序设计视频教程-徐红波-第4章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第4章 - C程序设计 讲师:徐红波 E
幻灯片-C语言程序设计视频教程-徐红波-第2章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第2_其它技巧_PPT制作技巧_实用文档。幻灯片-C语言程序设计视频教程-徐红波-第2章 C程序设计讲师:徐红波 Email:x_h_b@...
幻灯片-C语言程序设计视频教程-徐红波-第3章 - 副本_图文.ppt
C程序设计讲师:徐红波 Email: x_h_b@tom.com 第3章 数据类
C语言程序设计视频教程-徐红波-第13章_图文.ppt
C语言程序设计视频教程-徐红波-第13_研究生入学考试_高等教育_教育专区。c
幻灯片-C语言程序设计视频教程-徐红波-第7章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第7章 - C程序设计 讲师:徐红波 E
幻灯片-C语言程序设计视频教程-徐红波-第9章.txt
幻灯片-C语言程序设计视频教程-徐红波-第9章 - 本文由chekou贡献 pp
幻灯片-C语言程序设计视频教程-徐红波-第10章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第10_其它技巧_PPT制作技巧_实用文档。...[例10.11]用指针变量输出二维数组元素的值 (2)指向由m个元素组成的一维数组...
幻灯片-C语言程序设计视频教程-徐红波-第8章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第8章 - C程序设计 讲师:徐红波 E
幻灯片-C语言程序设计视频教程-徐红波-第5章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第5_其它技巧_PPT制作技巧_实用文
幻灯片-C语言程序设计视频教程-徐红波-第2章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第2章 - C程序设计 讲师:徐红波 E
幻灯片-C语言程序设计视频教程-徐红波-第4章_图文.ppt
幻灯片-C语言程序设计视频教程-徐红波-第4章 - C程序设计 讲师:徐红波 E