当前课程知识点:高级语言程序设计 >  结构体和共用体 >  9.4 结构体数组的定义和使用 >  结构体数组的定义和使用

返回《高级语言程序设计》慕课在线视频课程列表

结构体数组的定义和使用在线视频

结构体数组的定义和使用

下一节:共用体和枚举类型

返回《高级语言程序设计》慕课在线视频列表

结构体数组的定义和使用课程教案、知识点、字幕

大家好

本讲介绍结构体数组的定义和使用

上一讲我们的示例程序里

定义了一个结构体变量

只能存放一个学生的信息

现在如果我们有一个班的学生信息

要输入到程序里呢

就得定义结构体数组

结构体数组就是数组中每个元素

都是一个结构体类型的数据

结构体数组的定义与结构体变量相似

也有三种定义形式

这是结构体类型STUDENT的定义

如果定义一个变量a

只能保存1个学生的信息

定义b时

只要在b后面加方括号

就可定义b为数组了

结构体数组的定义和初始化

和一般类型的数组的定义和初始化

非常类似的

这里定义了长度一个为30的结构体数组b

在定义的同时呢

对它的元素进行了初始化

这里呢

我们只对它的前5个元素进行了初始化

那么后面的25个元素呢

就会自动初始化为零

前5个元素进行初始化的时候

每个元素的初始化列表呢

是单独用一个花括号括起来的

表示的是这个结构体数组元素的成员的初值

同样

这个花括号是可以省略的

但是注意

花括号省略的时候

花括号初值表里的常量类型

要与结构体定义时的顺序一致

也就是

按顺序应该初始化一个字符串类型成员的时候

对应的初值表里

刚好就是一个字符串常量

一般一个结构体变量成员很多

类型也不同

建议初值列表里不要省略花括号

这样可以让我们更清清楚的看到

每个成员对应的初值是什么

使得程序的可读性更好

由于所有元素的初始化列表

不可能在同一行书写完毕

所以一般将每个数组元素的初始化列表

单独书写一行

数组元素进行初始化以后呢

我们就得到了这样的一个表格数据

这个表格呢

就对应了数据库中的多条记录

每一行记录

其实就是对应了一个学生的信息

结构体数组最多可以存放30个学生的信息

这里初始化存放了五个学生的信息

如果我们希望编写一个程序

不要事先在程序里存放5个学生的信息

而是能在程序运行时

输入输出5个学生的信息

现在我们可以用结构体数组

保存一批学生的信息

每个结构体数组元素保存一个学生的信息

这是STUDENT类型定义

在主函数里

定义一个长度为30的STUDENT类型的数组

这里我们只演示5个学生信息的输入输出

我们可以调用上一讲介绍的

input函数和output函数

在调用input函数时

实参是每个数组元素的地址

在调用output函数时实参是数组元素就可以了

结构数组元素的使用方法与同类型的变量完全相同

如果我们希望编写一个函数

能够输入输出一批结构体数据

而不是输入输出单个结构体变量的数据

那么我们可以用结构体数组作函数的形参

但结构体数组本身不带特定的结束标志

还需设定一个整型参数

用来接收结构体数组的长度

现在我们在定义input函数时

设置两个形参

一个形参为结构体数组

一个形参为整型变量

在input函数体里

输入长度为n的结构体数组元素的值

在函数体里

用一个for语句

来输入n个数组元素的值

注意结构体数组元素的表示方法

和普通数组元素是一样的

输入时要具体到每个数组元素的成员的类型

不要忘记取地址运算符

output函数是输出长度

为n的结构体类型数组元素的值

输出时要注意数据输出的格式

在主函数里调用input函数和output函数时

实参都为结构体数组名

请大家思考

能不能将input函数和output函数形参里的

结构体数组改成结构体指针呢

能不能定义一个指向结构体数组的指针呢

用结构指针的移动

来完成对多个结构数组元素的操作

这是定义里一个STUDENT类型的数组s

这是定义了一个STUDENT类型的指针ps

可以将s赋给ps

可以这样写ps=&s[0]

这两条语句是等价的

如何访问结构体指针

指向的结构体数组成员

现在我们将ps指向数组元素s[2]

来看通过ps访问s的数组元素s[2]的成员

有两种方法

一种是使用圆点运算符

访问s[2]的num成员和name成员

注意这是用的圆点运算符

访问s[2]的sex成员

是用指向运算符

第4条语句是用指向运算符

给s[2]的birthday的year成员赋值

注意这两级圆点运算符和指向运算符的区别

结构体数组和结构体指针作函数形参时

下面四种写法是等价的

如果函数的形参是一维数组

C编译器是将它作为指针变量来处理的

我们完成了对结构体数组的输入输出操作

结构体变量能不能比较大小呢

结构体变量不能整体比较大小

但是我们可以比较结构体变量的某一个成员

并将结构体变量排序

请看例题

编写程序

从键盘输入5个学生的信息

将学生按分数排序后

在屏幕上输出这5个学生的信息

用结构体数组作函数参数编程实现

学生类型的数据整体不能比较

但是我们可以按

结构体的分数成员进行比较

将学生排序

在前面输入输出函数的基础上

我们增加一个排序函数

对结构体数组进行排序操作

在主函数里

调用input函数输入一批学生的信息

调用sort函数对这批学生

按成绩进行排序

最后调用output函数

输出排序后学生的信息

主函数的结构清晰简单

来看这三个子函数

我们可以将input函数和output函数

形参的结构体数组改成结构体指针

函数体里的语句可以不变

现在我们来看看sort函数

要排序就要有比较

除了整体赋值运算之外

C语言没有提供任何其他的

用于整个结构体的操作

例如比较操作

那么我们不能使用等于和不等于

来判定两个结构体变量是相等还是不等

那我们比的是什么呢

我们比的是学生的score成员

score成员是float类型

是可以比较的数据类型

我们这个排序算法采用的是选择法

尤其要注意的是

我们交换的是两条学生的记录

使用的是结构体整体赋值功能

我们来小结一下

像 int float char 等

是由C语言本身提供的数据类型

不能够再进行分拆

我们称之为基本数据类型

而结构体类型

可以包含多个基本类型

也可以包含其它的结构体

我们将它称为复杂数据类型

或者是构造数据类型

用户自己构造的数据类型

和基本类型具有一样的功能

可以用来定义变量 数组 指针

好了 这就是我们这一讲的内容

谢谢大家

高级语言程序设计课程列表:

程序设计和C语言

-1.1 计算机程序和计算机语言

--计算机程序和计算机语言

--致敬先辈:伟大的C语言之父——丹尼斯·里奇 程序员

-1.2 C程序的构成

--C程序的构成

--当前主流程序设计语言各自都有什么优势?

-1.3 C语言编辑、编译、运行(VC++2010学习版)

--C语言编辑、编译、运行(VC++2010学习版)

-练习题

顺序结构程序设计

-2.1 变量的定义和使用

--变量的定义和使用

-2.2 数据类型

--数据类型简介

--整型数据

--实型数据

-2.3 格式输出和格式输入

--格式输出printf函数

--格式输入scanf函数

--单个字符的输入输出

-2.4 运算符和表达式

--运算符和表达式

-2.5 结构化程序设计入门

--结构化程序设计入门

-练习题

选择结构程序设计

-3.1 为什么要用选择结构解决问题

--为什么要用选择结构解决问题

-3.2 如何正确表示选择结构中的条件

--如何正确表示选择结构中的条件

-3.3 用if语句及if语句嵌套实现选择结构

--用if语句及if语句嵌套实现选择结构

-3.4 用switch语句实现选择结构

--用switch语句实现选择结构

-练习

循环结构程序设计

-4.1 循环的引入

-- 为什么要用循环结构解决问题

-4.1 循环的引入--作业

-4.2 用while语句实现循环

--用while语句实现循环

-4.3 用do-while语句实现循环

-- 用do-while语句实现循环

-4.4 用for语句实现循环

-- 用for语句实现循环

-4.4 用for语句实现循环--作业

-4.5 何时需要用循环的嵌套

--何时需要用循环的嵌套

-4.6 如何提前终止循环和提前结束本次循环

--如何提前终止循环和提前结束本次循环

-习题--作业

数组

-5.1 数组类型的引入

--数组类型的引入

-5.2 一维数组的定义和初始化

--一维数组的定义和初始化

-5.3 一维数组的使用

--一维数组的使用

-5.4 二维数组的定义和初始化

--二维数组的定义和初始化

-5.5 二维数组的使用

--二维数组的使用

-习题--作业

指针

-6.1 什么是指针

--什么是指针

-6.2 指针类型及相关概念

--指针类型及相关概念

-6.3 指针变量的定义、赋值与使用

--指针变量的定义、赋值与使用

-6.4 指针的运算

--指针的运算

-6.5 指针与一维数组

--指针与一维数组

-6.6 指针的指针

--指针的指针

-6.7 指针与二维数组

--指针与二维数组

-习题--作业

函数

-7.1 为什么要自定义函数

--为什么要自定义函数

-7.2 函数的定义

--函数的定义

-7.3 函数的调用

--函数的调用

-7.4 函数参数的传递

--函数参数的传递

-7.5 函数的嵌套调用和递归调用

--函数的嵌套调用和递归调用

-7.6 变量的作用域和存储类型

--变量的作用域和存储类型

-习题--作业

字符串

-8.1 字符串的存储及输入输出

--字符串的存储及输入输出

-8.2 系统字符串处理函数

--系统字符串处理函数

-8.3 自定义字符串处理函数

--自定义字符串处理函数

-习题--作业

结构体和共用体

-9.1 结构体类型的定义

--结构体类型的定义

-9.2 结构体变量及指针变量的定义及使用

--结构体类型变量和指针变量的定义和使用

-9.3 结构体变量和指针变量作函数的参数

--用结构体变量和指向结构体的指针作函数参数

-9.4 结构体数组的定义和使用

--结构体数组的定义和使用

-9.5 共用体类型和枚举类型

--共用体和枚举类型

-习题--作业

动态内存分配

-动态内存分配--习题

文件

-习题--作业

结构体数组的定义和使用笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。