当前课程知识点:C语言程序设计(上) >  数组(二) >  5.7 二维数组的应用‍ >  5.7.2 用一维数组方式引用二维数组元素

返回《C语言程序设计(上)》慕课在线视频课程列表

5.7.2 用一维数组方式引用二维数组元素在线视频

5.7.2 用一维数组方式引用二维数组元素

下一节:转置矩阵.c

返回《C语言程序设计(上)》慕课在线视频列表

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

我们只用一重循环

来控制的它

这就是我们说的

要用

一维数组的方式

一个循环

来访问了二维数组

这就是

我们在强调的是说

对二维数组

多维数组

都是一样的

是一个连续存放的空间

C语言程序设计(上)课程列表:

从问题到C语言程序设计

-1.1 计算机的问题求解方法

--1.1.1--程序设计面向的问题

--1.1.2--关于计算

--1.1.3-1关于算法-算法的特征

--1.1.3-2关于算法——算法的表示

--1.1.3-3关于算法——算法的优化

--1.1.4-1-程序设计方法

--1.1.4-2-程序设计方法

--讨论题:数学模型

-1.1 计算机的问题求解方法--作业

-1.2 C语言与C程序

--1.2.1-1-C概述

--1.2.1-2-C概述

--1.2.2-C初步

--讨论题:运算符

-1.3 C语言处理系统与程序调试运行

--1.3.1C程序如何调试运行

--1.3.2常用C语言处理系统

--1.3.3DEVC++的使用-v1

--1.3.4C语言概貌小程序

--例程

-1.4 程序中的人机交互

--1.4 printf用法

--1.4.2 scanf的用法

--例程

--作业讨论区

数据计算实现与顺序结构程序设计(一)

-2.1 算术运算的C程序实现

--2.1.1 第二章

--2.1.2 C语言算术表达式概念

--2.1.3 算术运算的实现

--2.1.4 整数相除

--2.1.5 输入格式造成的计算错误

--2.1.6 求余运算

--2.1.7 自增自减运算

--2.1.8 复合运算

--fangcheng.c

--fangcheng-1.c

--fangcheng-2.c

--fangcheng-3.c

--fangcheng-4.c

--算术混合运算.c

--讨论题:自增自减符

--讨论题:程序输出结果

--讨论题:程序运行结果

-2.1 算术运算的C程序实现--作业

-2.2 关系运算的C程序实现

--2.2.1 关系比较问题

--2.2.2 C语言关系表达式

--2.2.3关系运算优先级

--2.2.4 用关系运算做判断条件

--2.2.5 程序实例

--2.2.6 字符比较

--bukao.c

--pingshifen-1.c

--panduanzhengshu.c

--pingshifen-2.c

--字符比较.c

--讨论题:比较大小

--讨论题:程序的运行

-2.2 关系运算的C程序实现--作业

-第二周作业--作业

数据计算实现与顺序结构程序设计(二)

-2.3 逻辑运算的C程序实现

--2.3.1 逻辑运算问题~1

--2.3.2 逻辑运算表达式

--2.3.3 如何判断闰年

--2.3.4 逻辑运算优先级

--2.3.5 条件运算符

--计算结合性

--2.3.7 一个简单实例

--闰年.c

--自动购票问题.c

--讨论题:逻辑表达式

-2.3 逻辑运算的C程序实现--作业

-2.4 位运算的C程序实现

--2.4.1 什么是位运算

--2.4.2 位运算有哪些

--2.4.3 位运算怎么用

--讨论题:位运算

-2.5 几种很个别的运算

--2.5 几个很个别的运算

--讨论题

--讨论题

-2.5 几种很个别的运算--作业

-2.6 混合运算及数据类型转换

--2.6 混合运算及数据类型转换

--讨论题:数据类型

-2.7 顺序结构程序实例

--2.7.1 第一个程序:三角形

--Video

--三角形面积.c

--讨论题:工业产值

--讨论题:程序无效结果

-2.7 顺序结构程序实例--作业

选择结构的程序设计

-3.1 程序中的路径选择实现

--3.1.1_1 第三章

--3.1.1_2 神奇的if_else

--打印学生成绩.c

--一元二次方程.c

-3.1 程序中的路径选择实现--作业

-3.2 路径中的再选择——嵌套判断

--3.2.1_1 if语句的嵌套

--3.2.1_2三个数排序1029

--例程

--3.2.2 用户登录检查

--三个数排序_未优化.c

--三个数排序_优化.c

--讨论题:程序改错

-3.2 路径中的再选择——嵌套判断--作业

-3.3 复杂判断问题的C程序设计

--3.3 多级选择

--银行存款.c

--讨论题:多级选择

-3.4 多分支问题的C程序设计

--3.4.1 switch语句表达式

--3.4.2 加减乘除计算

--3.4.3 几类说明

--加减乘除运算.c

--讨论题:关于switch

-3.4 多分支问题的C程序设计--作业

-3.5 GOTO的适当使用

--3.5 GOTO的适当使用

-3.6 选择结构的程序实例

--3.6 程序展示

--计算第几天.c

--存款利息__switch实现.c

--讨论题:输出奇数

--讨论题:计算税金

-3.6 选择结构的程序实例--作业

-第四周作业--作业

循环结构的程序设计(一)

-4.1 需要重复执行的程序

--4.1.1----第四章~1

--4.1.2---while实现先判断后循环~1

--4.1.3----while循环的应用-录入速度~1

--求和.c

--打印学生成绩.c

--统计录入速度.c

--求平均数.c

-4.1 需要重复执行的程序--作业

-4.2 至少要执行一次的循环

--4.2.1至少要执行一次的循环

--4.2.2-do-while循环应用

--成绩录入_do while实现.c

--n的阶乘.c

--字符分类统计.c

--讨论题:关于while

-4.2 至少要执行一次的循环--作业

-4.3 已知循环次数用for语句

--4.3.1--用for语句控制循环次数

--4.3.2--循环的应用-求和

--求和问题.c

--斐波那契数列问题.c

--数列求和.c

--讨论题:循环语句的不同

--讨论题:循环语句

-4.3 已知循环次数用for语句--作业

-4.4 循环控制——简单循环应用

--4.4.1-循环的应用-找数-水仙花数

--4.4.2--循环的应用-求素数

--水仙花数.c

--讨论题:死循环

--讨论题:continue和break

--讨论题:猜数字

-循环结构的程序设计(一)--4.4 循环控制——简单循环应用

循环结构的程序设计(二)

-4.5 循环的嵌套

--4.5.1 循环的嵌套——九九乘法表

--4.5.2 循环的嵌套——打印三角形

--打印九九乘法表.c

--打印实心三角图案.c

--打印空心三角图案.c

--讨论题:程序运行

-4.5 循环的嵌套--作业

-4.6 break与continue

--4.6 循环中断与继续循环——break再讨论

--最大素数.c

--求正数个数及平均数.c

-4.6 break与continue--作业

-4.7 循环的综合应用

--4.7.1 数的排列组合问题

--4.7.2 循环综合应用——穷举算法

--4.7.3 循环综合应用——满足条件的数

--4.7.4 循环综合应用——求最后三位数

--4.7.5 循环综合应用——打印空心图案

--数的排列组合.c

--数的排列组合优化.c

--鸡兔同笼.c

--找满足条件的数.c

--输出14的13次方的最后三位数.c

--打印空心字符.c

--讨论题:打印图形

--讨论题:打印空心图形

--讨论题:计算闰年

-第六周作业

--虚拟实验:循环程序设计实验

-第六周作业--作业

数组(一)

-5.1 同类有序数据处理问题

--5.1.0 数组开篇

--5.1.1 同类有序数据存储问题

--讨论题:下标变量与下标

-5.2 一维数组的定义和引用

--5.2.1_1 数组的定义~1

--5.2.1_2 数组的初始化

--5.2.2 一维数组的输入输出

--5.2.3 一维数组的应用1--成绩排序(选择法)~2

--5.2.4 一维数组的应用2--Fibonacci数列

--数组定义.c

--数组初始化.c

--输出大于平均值的数.c

--反向输出.c

--选择法_成绩排序.c

--求斐波那契数列前n项.c

--讨论题:对称数

--讨论题:关于'\0'

-5.2 一维数组的定义和引用--作业

-5.3 一维字符串数组

--5.3 一维字符串数组11.24~1

--用函数测试字符串长度.c

--讨论题:编程

-5.4 字符串处理函数

--5.4 字符数组的输入与输出

--字符串反向.c

--字符串函数

--讨论题:程序如何运行

--讨论题:黑色星期五

数组(二)

-5.5 二维数组的定义与使用

--5.5 二维数组定义

--二维数组的定义与初始化.c

-5.6 二维数组的输入输出

--5.6 二维数组的输入与输出

--二位数组输出_矩阵输出.c

--讨论题:随机数据存储

-5.6 二维数组的输入输出--作业

-5.7 二维数组的应用‍

--5.7.1二维数组的应用-转置矩阵

--5.7.2 用一维数组方式引用二维数组元素

--转置矩阵.c

--找二维数组最大数.c

--讨论题:修改程序

--讨论题:关于随机数函数 rand()

-5.8 二维字符数组

--5.8 单词排序

--单词排序.c

--讨论题:回文字符串

-5.8 二维字符数组--作业

-5.9 数组综合应用

--5.9.1 应用1——学生成绩统计

--统计成绩.c

--5.9.2 应用2——删除重复字符

--删除串中的重复字符串

--5.9.3 应用3——统计字符

--5.9_4数组的应用4--矩阵相乘

--统计字符次数.c

--讨论题:洗牌

-本期课程结束语

--end

-第八周编程作业

--虚拟实验:冒泡排序算法程序设计实验

期末复习

-《C语言程序设计(上)》期末复习参考

--html

期末复习答案

-《C语言程序设计(上)》期末复习参考答案

--html

5.7.2 用一维数组方式引用二维数组元素笔记与讨论

也许你还感兴趣的课程:

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