当前课程知识点:C语言程序设计(上) > 数组(二) > 5.5 二维数组的定义与使用 > 5.5 二维数组定义
大家好
我们前面学习了一维数组的定义
初始化以及
数组里边的元素的一个使用的问题
尤其是我们结合了字符串数组的处理
字符串的处理问题
讨论了一维数组的使用
那么我们今天开始学习
二维数组的
来定义初始化与使用
那么它两个之间有多大的差别呢
其实 对数组而言
就有两点是最重要的
至于一维二维
从本质上的差别并不大
那么哪两点是重要的呢
第一是存储 第二是访问
那么 存储我们在关注的说
它是内存的一片
连续的存储空间
无论它是一维数组 还是二维
多维数组 都是这样的
一片连续的存储空间
那么 这一片连续的存储空间就带来了
访问上的一个便利
什么便利呢
我们可以访问数组里边的任何一个元素
那么 按什么去访问呢 位置
按位置去访问
数组里边的任何一个元素
就是这两点
存储 以及按位置
也就是按下标变量去访问
对于二维数组
具体来说 它的定义以及它的使用
都存在哪些问题呢
我们来看一下它的定义的格式
大家一看 跟一维数组
长得几乎完全一样
就是多了一个
表达式2 那它表示什么呢
表达式1 是行 就是一维数组
里边也有 这个是元素的个数
那我们现在是行数
第二个表达的是
表达的是它的列数
比如说 我们举个例子看
int a数组 flaot一个b数组
那么a数组我们对它的解读
这是一个两行三列的数组
那是几个元素呢
占了多少个字节呢 我们看int系
那么如果你用的系统
int是两个字节 那就是
2×6=12个字节
如果你用的系统是4个字节
那就4×6=24
也就说 你这个
我们定义了 a数组
这个a数组的内存占了
要不就是12个连续的字节数
要不就是
24个连续的字节数
那么这里边的
增量是多少个字节呢
也就是说
每一个数组元素它的存储空间
多大呢
那就是int型
到底是两个字节还是4个字节
那对float的这个b数组来说 是同样的道理
是3×3的整个元素
然后 flaot一定是
4个字节 那就4×9占了连续的
36个字节的一个存储空间
那么我们去访问这个存储
空间里边的任何一个元素的时候
那个增量 这个4
或者这个2它就是
非常重要的 是因为按照这个位置
去找着它这个元素的
大家一定会关注
下一个问题是它的初始化的问题
那一维数组我们可以初始化
二维数组当然也可以初始化
那么按什么呢 我们看
一样 花括弧里边是
要初始化的这些数据
但是二位数组因为它是分行的
那我这数据到底怎么摆放呢
可以 一行一行的摆放 这种形式
一行一行的摆放
用花括弧括起来
也可以不分行 什么情况下呢
很规矩 我们是3×3的数组
整好给了9个数据
那就是一个一个放进去
那这种情况我们是可以不分行的
当然 如果我们3×3的数组
我没给了全部数据
也可以不分行 比如说我就给了5
5个数据 6个数据
那他就挨着放前边的第一行第二行
放的哪一个数据按行依次存放
是这样的规则 按行依次存放
那还有另一种情况呢
我们给部分元素初始化
这是我们在一维数组里边说
是可以的 二维数组当然也是可以的
我们对第一行上
前两个元素初始化
前两个元素
那么 第二行上呢这个4
给了谁呢 一定是给了第一个元素
那 大家关心的剩下的元素呢
从一维数组那我们就知道
只要你初始化过
剩下的元素统统清0
那这种情况呢
我们说 两行3列的这个a数组
我们只给了两个元素
那是给了第一行上的前两个元素
剩下的统统 清0
那前面还有1个情况
是说 下标 这个
一维数组的下标可以省
二维数组的可以吗
两个下标都可以省吗
不可以 只可以省行下标
大家想想 如果我列下标也没有的话
我怎么知道这些元素
都给了谁呢
如果省了行下标
按照列下标
取前三个给了第一行
取后三个给了第二行
那这个a数组一定是两行3列
如果你给了9个数据
那一定是3行3列
它是按列去取
给每一行上放数据
所以 这块要强调
一定是两点 一点是说
省略的只能是
行下标 不能是列下标
第二个呢 还有非常重要的一点
你要做这种省略的时候
必须是给所有的数组元素初始化
才能用这种省略的方式
不能给部分元素初始化
那我们看一个 给一个例子
咱们看一下 整个看一下说
数组的定义啊 初始化啊 输入输出
这些问题怎么做
我们看一个例子是说
用我们开一个二维数组整好放同学的成绩
比如说 咱们班 现在我们
8000人 9000人
每人 比如说我们这学期学了5门课
那我就是
8000比如说8000人
8000×5这么大的一个数据
那我们现在别8000×5了 我们先
3个人 3门课
那这是3×3的一个叫fs的数组
我们给它初始化的是说
第一行 第二行 第三行
我们分别用蓝颜色
红颜色 黑颜色标识出来
我们是想讨论它在内存里
到底怎么存放呢
我们看一下
看见的这个内存的形式
跟一维数组一模一样的
是线性的 连续的一片空间
那蓝颜色的
是第一行 红颜色第二行 第三行
那现在是按行存放还是按列存放
显然是按行存放的
你对数组进行了这样的初始化
它到内存里自然存放的方式
是按行存放的一个方式
大家看 那这个数组
二维数组是不是也长得有点像一维数组
事实上
任何多维的数组
在内存里存放都是这样线性存放的
我们下来一定关注的问题是
怎么引用呢
我一定要从头到尾使用吗
我要使用第二行上的
这个 55这个数据可以吗
我们把这个数组
分数这个数组给了程序
然后 我们看一下它
我们刚才讨论的
初始化定义以及输入输出的问题
我们来看一下这个程序
在这里边
那我们定义了int的fs
是给了一个?常量
我们给的是3
3×3的一个数组
然后 我们现在是怎么给这个数组里边
放的数据呢
咱先不看这个注释的这一块
我们先不看它
先看写数据
是通过scanf写进去的
那么这个scanf 每一次写的是谁呢
一个数组元素
fs这个数组元素里边的
第i行第j列
而我们现在的i 是谁
是外循环控制变量
从0到谁呢 小于n是2
从0~2 内循环是j
从0也~2
那也就说 外循环
是0的时候 内循环
从0变化到2
显然是按行去读取数据的
那输出我们看一下
这也一样 我们给的是
i和j作为它的下标控制
分别是行和列
然后把它输出一个这样子的一个分数
带着个格式的行 列
对的i j以及分数
这样的形式 我们运行一下
给3行3列给9个数据
我们简单就给1 2 3
大家看 这是我们
按第1第0
下边为0的这一行
下标为1的行 下标为2的行
这就是我们在内存里
也是按照这样的一个顺序存放的
这是我们刚才说的用scanf
把数据写进这个分数这个数组里
如果我们不是这样子
如果我们有很多的 很大量的
数据100个上千的这样的数据
那我上千个数据我们不可能搁在这里边
如果是有那么一个班30个人的数据
那我们这样scanf的方式
肯定是不可取的
我们把这个scanf这一块注释掉
咱用初始化的方式
也就说我们先用一个初始化的方式
把这恢复了
那么这时候 别忘了
不能重复定义 这一块要删掉
我们看 定义了
分数 然后给它
按行进行了初始化
那我们看这个输出
这是刚才我们不用scanf敲进去了
它就自动出来了
那我们刚才讨论过的几个问题是说
我这里边呢
第一行上我就给了两个数据
第二行上 我们刚才说给了
一个数据 第三行上我还就没给
给部分元素初始化 这样可以吗
那剩下的元素是什么呢
我们输出看一下
1 2这是在下标为0的行上
下标为1的行上只有第一个有4
剩其余的全是0
这是我们刚才说这个是没有问题的
那我们还有一种情况说是
比如说这种 这种情况 我下标
这样 把行下标缺什么
我后边可以这样给吗
大家看 如果我这样给的话会是什么情况呢
大家看 这是不是就不对了
第1 2是对的 这个4也是对的
但是后边呢这些就不对了
这个不对的原因是什么呢
我们是说
当你把这个下标
省略了的时候
我们需要规则是
给所有元素初始化
不能给部分元素初始化
所以呢 这块我们是
用这样一种方式 我们把这个拿掉
用这种 这样的方式
大家看 我们
没有下标 然后呢 给了9个数据
它自动去取 取了3行 我们看一下
这就没有问题了
那我们刚才在这说到几个问题
一个是初始化的问题
一个是 输入输出
对下标的这个二维数组的输入输出
我们看见了
非常标准的
你进行输入的时候也是两层循环
输出的时候也是两层循环
外循环控制的是行 内循环控制的是列
那这里边尤其要注意的是说
当你 这个下标
一维的行下标要省略的话
你后边的元素是给所有元素初始化
那么什么时候我们
会舍不得去写这个行下标呢
那我们在什么时候会舍不得写这个下标呢
就是说我并不知道这个行到底有多少
比如说我们说这个班到底是30个人
还是40个人还是25个人
我并不知道
但是我却知道这一堆数据
那我把数据搁进来
它按照数据去取了 自动取了它多少行
就是这种情况下
我们是需要把行下标省略了
那么 行下标省略的时候
大家说 这里边的数据
必须是一个完整的数据
好 这一点大家一定要注意
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html