当前课程知识点:C语言程序设计(上) > 数组(二) > 5.7 二维数组的应用 > 5.7.2 用一维数组方式引用二维数组元素
大家好
我们接下来看一下
这个标题的说法
大家就会觉得有点
奇怪
二维数组为什么能用一维的
方式去访问
我们来看一下
这块我们写了一行字
怎么讲呢
我们看这是一个二维数组
它的逻辑上是这样
一行
二维数组的一行
两行 三行
那么它在内存里的存放呢
是跟一维数组看上去是一样的
是它的
一行 两行 三行
这样子
那么这在内存里
实际上表达的意思是什么呢
我们说二维数组的
数组的名字
无论是一维 二维
还是多维数组
数组的名字都是一个地址号
是一个地址常量
它标识了什么意思呢
它标识了在内存的这个地方
有一个地方
这个地方我们现在比如说
它的起点
这个地址号是3000H的话
那么
a数组从这开始
往下的一片连续的空间
就是a数组所占的地盘
那从这我们看上去
这实际上
对内存而言
它就是一个一维数组
是一个线性存放的数组
那么既然这样
我们说
从
起点是知道了
然后呢
我们步长也是知道的
为什么呢
我们说数组元素里边
每一个格子是一样大的
我们经常说
一个萝卜一个坑
对数组来说
这个比喻还是合适的
那这里边我们说
萝卜可以不一样大
比如说是2 是9 是7
是可以数值是不一样大的
但是
这个坑必须是一样大的
这就是我们说的
数组元素的类型
必须是一样的
那既然这样子的话
起点
起始地址我们是知道的
那每一个增量的这个量
每一个格子的量
我们也是知道的
那么我们顺着起点
一步一步往下走
这不就能遍历到了
所有元素了吗
事实上就是这样
无论是二维数组还是多维数组
放在内存里都是
这样线性存放的
只要我们找到了它的首地址
和
它的类型
那么你可以很方便的
访问到它所有的
数组元素
那我们
可以把它表达成这样的形式
这个形式我们还要特别说一下
我们大家看
a0 a1 a2这样的形式的时候
在一维数组里很简单
它就是一个数组元素
可是在二维数组里
它却表达的不是一个数组元素
我们前边说过
如果
要从我们的课程里边
或者从
数组里边
找一点有难点的地方
这一块容易是大家
容易混淆概念的地方
怎么讲呢
在二维数组里的这个标识
它不是一个数组元素
是
这一行的
行首的地址
是二维数组里边的
行首的地址
所以呢
它仍然是一个地址号
那我们把它对等到内存里
它和
a
a+1
a+2
是一样的
是一个地址号
那也就是说我们找到了首地址
你怎么样能迅速的定位到
你的第i行
a+1是一种办法
a1也是一种办法
那么第i行
a+i是一个办法
ai也是一个办法
那这样
我们就迅速的定位到
无论你是
看的是逻辑上的这个数组
还是我们看的实际上的
从内存里去理解
那么都是非常方便的能定位到
这个数组里的任何一个地方
如果我们这样讲的话
是说
你把这个
a0 a1 a2这样的东西
看成一个整体
我们用黄颜色把它标识了一下
是说在大家脑子里
形成一个整体的概念
你可不可以认为
它就是一个数组的名字
如果它是数组的名字
它的元素是谁呢
就这一行上的
这些元素
就是它这个一维数组的
数组元素
那对于这个二维数组来说
它相当于有
三个
元素
每一个元素里边
又是一个一维数组
所以呢
从这个意义上说
我们说二维数组
实际上是
数组的数组
那就是说我们看
这三个元素它是一个一维数组
而每一个数组元素里边
又对着的是一个
一维数组
那要这个东西做什么呢
我们看一下
对这个二维数组来说
我们刚才说
我们可以把它
这样看
看成是
三个一维数组
那我们
用a来标识了什么呢
这个整体数组的首地址
那我们用ai来表示了什么呢
第i行的首地址
这一行的首地址
那我们还可以进一步的表达
a+i
跟它是一样的
第i行上的首地址
那再进一步的表达
我们可以做什么呢
第i行上的首地址加上j
我们就定位到了
这一行上的任意个元素
任意列
比如说2
那我们就是什么呢
a1加上谁呢
那我们就是什么呢
a1加上谁呢
加上1
那就定位到了
这个位置
定位到了这个位置
我们这样说
说它两个是
描述的是同样的东西
什么东西我们看
这个是我们熟悉的
取地址
取的是谁的地址呢
a数组里
第i行第j列的地址
这样我们是用了一个
二维数组来表达的它
那我们看这边
是用了一维数组的形式
一维数组ai的
这样的一个下标
加上一个j
我们同样地
描述了
第i行上第j列的这个元素
那从这个意义上说
这种描述
和
这种用二维数组元素描述的方式
和用一维数组元素描述
是一样的
只是说我们这
还经过了一个取地址运算
而在这
它直接给出来的就是地址号
这样的话
我们现在说
红框框
框起来的这些部分
描述的统统都是地址
那我们要关心
就是说
把二维数组用一维去表示的话
那一维的这个元素
现在表达的是
不是元素的内容
而是
元素所在的地址号
就是坑的号
那我们现在要知道
这个坑里装的是什么内容
怎么做呢
就是说
内容是怎么样表示呢
就用这样的地址
我们怎么把它的内容找出来呢
这是一个方法
括号
用一个星号
这是我们在前边讲
c的运算符的时候
这一个我们是留下了
没讲
为什么呢
c有34种运算符
我们循序渐进地
来了解一些
那么今天我们提到的这个运算符
是一个什么呢
取内容
按照你给定的这个地址
把它里边的内容取出来
比如说
7号
这个元素所在的地址
我只要知道它的地址
我用
星号一个运算
就会把这个7取出来
那这样描述
现在对等了谁呢
就跟我们平常说
a数组里
i行j列的这个元素
它们表达的
就是这个元素里的内容
那和这种描述方式
就是一样的
那一样的
这个写得还长呢
这个很短
对不对
为什么一定要这样描述呢
我们主题是什么呢
这样有什么好处呢
它最显而易见的好处是
我本来用两重循环解决的问题
我现在就可以用一重循环解决
需要的是什么呢
就是用
一维的这种形式
直接表达地址
来描述了
它确定的元素里边的内容
那我们下边看一道例题
我们来看一下例子
这个例子是说
这个题目是说
二维数组我不管是几乘几的数组
哪个行上的哪个列上的
这要你这个数组里边的最大的
就是我关心的
那我们一定
大家一想就是
要从头找到尾
不能落下任何一个角落
然后呢
我们才能确定哪个数最大
从头找到尾
那这件事情呢
我们最简单思路
根据我们刚才讲的
那你的二维数组在内存里
不就是这样放的吗
我们只要知道
这个数组的名字
这个数组的名字
就它的首地址
我只要知道了它的首地址
第一个元素所在的地址
那我们
加1 加1 加1
就访问到了所有的元素
那么大家想想
这样是不是我们只要找到了
第一个地址
取它里边的内容
然后这个地址加1
再取它里边的内容
地址加1
首地址加1
在取它的内容
我们就得到了
每一个元素里边
它是什么内容
然后用它去做比较
我们看一下它的程序
我们看这个程序
大家过来看一下
在这里边呢
我们除过包含之外
定义了一个5乘5的数组
我们为了简单直接给的是常量
通常呢大家会
实际应用里边会给符号常量
然后呢我们看
这一个双重循环是做什么呢
大家看在这里边
这个双重循环最核心的一句话是
给a数组赋值
就是产生这个a数组
好了我们现在看
在这里边有一个
rand
这是一个我们
之前没有用到过的一个函数
一个什么函数呢
大家一看包含
有朋友就会很敏感
为什么要包含这个math呢
math不是数学的
数学的头文件吗
是的
没错
它是数学的头文件
因为这个rand就是
一个数学函数
是干嘛呢
产生随机数
产生随机数
那我们现在是说
我也不想scanf
我也不想初始化
你随便给我产生一组数
放到我这个二维数组里
然后
我们的程序的功能是
从这一组数里边
找出最大数来
那我们产生的随机数
通常来说
是
小数
所以我们
为了简单起见
我们给它
求一个
求余
通过这个过程
我们找到了这个
产生了这个二维数组
并且呢把它输出
每产生一个就输出一下
把这个元素输出
那么也就是说
这个两重循环结束了
我们产生了二维数组
并且输出了它
我们看见了原始数组是什么
然后下边呢
我们开始做什么呢
从这个里边
找最大数
我们看
这里边用了一重循环
两重循环
来做什么呢
因为我们访问的是
二维数组
这是行下标 列下标
在这里边做什么事情呢
开始我们把第一个数据
数组元素
送到temp
然后呢
在
这个核心里做说
你这里边的数
比你当前的这个数还小吗
如果还小我们要找最大的
如果小
那么就是说当前这个数大
我就把
大的这个数送到temp
所以
等跳出这个两重循环
temp里一定是最大数
我们就printf它
大家看
这个方式
我们在访问的过程里边
用的是
二维数组元素的
这种方式
那么我们可不可以说
用
不要这一重循环了
只用一重循环
来做这件事
那我们
拿另一个程序看一下
我们来看这个数组
前边跟它是一样的
跟我们刚才是一样的
只是下边
现在有点不同
大家看
我下面用了一个一维数组
不是二维数组
这个一维数组里边
我们看
这个i
不是说
i从0到5
j也从0到5
是
i从0到哪里
小于5乘以5
对的谁
对的我们这个数组
就是5乘以5
五五二十五
我们这个数组里边一共25个元素
那下标到24
小于25
在这里边做什么呢
大家看temp跟谁去比
跟一个
我们取了
第一个元素的地址
取地址
把这个地址取出来
加上i
i第一次是0
那第一次就不加
然后取它的内容
取它的内容就是取
这个位置上的
数据
而这个位置上
我们现在取的是取地址
地址加一个i
仍然得到了地址
然后再取它的内容
往下
每一步是一样的
取到了一个地址号
地址
每一步往下加i
那么就加0
加1 加2
一直加到24
顺序访问了
这个线性存储的
一片连续的空间
那大家看
它会不会说我这里边
这看上去还是一个二维数组啊
但是大家别忘了
这里边始终都是0
没有用
ij的这样的方式
所以我们实际上
这一块写的是
首地址
取了首地址的
号
然后加上i
我们只用一重循环
来控制的它
这就是我们说的
要用
一维数组的方式
一个循环
来访问了二维数组
这就是
我们在强调的是说
对二维数组
多维数组
都是一样的
是一个连续存放的空间
-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