00:00
下面呢,我们接着来看一下二维数组的它的使用方式,以及二维数组在内存里面存在形式,这是一个重点,大家都知道韩老师讲课风格呢,一般是这样子做的,先给大家来一个入门,不谈细节,然后呢,我们就在这里面呢,给大家讲一下这个细节的内容,以及我们这个数据结构,包括二维数组在内存里面的一个布局,因为我们只有理解了一个数据类型在内存里面的布局,我们才能深刻的理解这个数组。它到底是怎么存在的,那么你运用起来呢就会得心应手,好朋友们,那现在呢,我们给大家看一下怎么使用二维数组,在这里我们把内二位数组的内存布局也给大家讲解到位好使用方式一、先声明再定义其实刚才啊,各位同学这个案例其实就是先声明的。就先先声明哦,不是先声明啊,是先声明定义过后再赋值,你看刚才老师的这个案例呢,就是这样子做的,对吧,先定义了一个,然后赋值,然后再使用,对不对,这是第一种使用方式,那么它的基本语法呢,其实刚才同学们也见过了,就是数组名。
01:17
然后大小大小,第一个这个大小。第前面这个大小指的是你这个二维数组共有多少个元素,第二个大小是指的你的这个二位数组里边的各个一位数组有几个元素,能理解吗?然后呢,你比如说这个案例AL23对不对,二三这样子这个地方可以不要啊,后面这个是可以不要的,也可以带上啊,刚才老师在这做的时候,你看我后面就没有再加这个中括号了,所以说这块呢可以不要把它去掉。诶,去掉,那么使用案例其实前面已经讲过了,那现在呢,我重点想给大家介绍一下二维数组在内存里面到底是怎样怎样布局的,来吧,我们把这个重点拿过来给大家做一个讲解。
02:09
注意听讲啊,同学们。注意听这块非常的重要。好,这是它的第一种使用方式,我们给他来一个标题二,好吧,语法是什么样子的?刚才老师已经说了。这是第一个探讨的话题,语法不说了,第二个一个简单的应用使用案例,刚才前面我们也说了,现在呢重点是给大家说一下内存布局,来,我们就以这个图形来给大家就以这个来做一个二维数组的内存布布局的演示,我为什么把这两个数据调小了,调小的原因是因为这样我比较好画。如果我还按前面这个四六的话,四和六这个数数组的元素太多了,我画起来比较吃力,所以说我把它数据都减小了一下,好不好来看这个图形好的,那现在呢,我们就把这个粘贴复制到我们的笔记里边去,注意听讲。
03:09
O了,因为前面已经有一个AR了,所以说我把它写成二好不好,好我们来看看它是怎样布局的。一。这个为例为例来说明说明,或者叫分析分析这个二二。在内存的布局。内存的布局,这个是非常重要的,来吧,那老规矩,我们打开一个Excel表。打开我们的Excel表,没问题吧,这是我们Excel表里边呢,我们就来开始画这个东西了,同学们跟上思路。好的,嗯,这里我们先插入一句话,对吧,我们写个东西叫二维数组在内存的布局。
04:01
哦了,那现在呢,我们先把这个代码给他放过来,呃,我在这里稍微的改变一下好不好,这样子我把这个二二我我就随便改其中一个值吧,好不一一给它改成一个十,然后呢,我这输出了一句话好不好。2V2,好,这个我相信同学们知道是什么意思啊,大家看这句话我先给大家执行一下,看效果。那为了好看呢,我这里仍然给他来一个什么呀,换行,这样子看起来比较清晰一点,跑起来。跑起来,大家看这里输出是这样子的好不好,记住这个这个这个形这个图形啊,然后呢,我把这边的代码。我把刚才老师写的这段代码给它放到我们的Excel表里边去,注意听讲。放好了对不对。放好了,然后呢,我这里用一个箭头来表示代码在哪里执行,执行到哪一行了,然后这是我们的内存图。
05:06
这是我们的一个内存。没问题吧?啊,没问题,我在这儿写一句话,这叫内存。没问题啊,现在有了这个内存,有了这个代码过后呢,我们看第一句话执行过后就是2V2,这句话一旦执行,就是现在老师指这个箭头指向的这句话,执行了过后,在内存里面会出现一个什么样的情况呢?他是这样子的,注意听,首先。会有一个二二这个名称出现,对吧,它肯定会有一个变量的名字,然后呢。他在这个地方注意听。哦,他在这个地方,我为了好看,我还是拿一个这个东西来画。它在这个地方就会有一个空间嘛,给它对应好,为了好看呢,我把它标成黑色的好吧,黑色的那么这个空间里边存的是什么呢?注意听它在这个空间里面并没有直接存放这里面的数据。
06:10
而是有两个指针你听。好,我这呢给他标一个这个表示它有,它把这个空间分成两个部分,其中第一个部分它是一个指针。它是一个指针,指向一个位置好,指针是什么,我待会再说,再看第二个。这地方又是一个指针。那么问题来了,说老师那你说的是什么意思呢?因为大家看到,因为你这个OV2其实是一个两个元素。它是两个元素,只是每一个元素呢,指向的是一个一位数组,对不对,那也就是说这个指针和这个指针其实是分别。指向了两个,呃,分别指向了一个一位数组。那有有些同学老师你能把这个地址给我打出来看一下,没问题,我给你们打出来看一下,注意听讲,关键的地方来了。
07:05
我们首先输出第一个地址。Print f。这个应该是大写的P,好吧,我们写出二。二它的第一个元素的地址。地址是多少?用这个来输出,取出来二二。一零好,它的第二一个元素。他的地址是多少呢?就是一,我们先把这两个地址打印出来看一下,跑起来说,诶,为了好看,是不是我应该有个什么呀,有个换行,不然的话我看起来就比较吃力了。先把这个地址打出来,大家看一下。跑起来,同学们可以看到,在这里其实出现了什么呢?两个例子。一个是这个地址。看到没有?这个地址呢,你可以认为就是在这个位置。
08:02
好,当然因为这个空间的原因呢,我这里。把它稍微的挪动一下,好往这边再来大一点,这是一个地址,还有一个地址,同学们看到还有一个地址是它。而且你们有没有发现,同学们,你们有没有发现这两个地址,他们刚好相差多大,看出来没有,大家看到270和288是不是刚好相差24个字节?是不是你看7088,如果相差四,相差24个字节,是不是在这个七零上,七零基础上你加24,你加一个24,是不是刚好等于88,为什么刚好相差24个字节呢?因为你每一个元素里边有三个int,而一个int是八个字节。因此它的跨度刚好是三个字节的跨度。对吧,三个字节,因为这个是位嘛,对吧,三个字节你这个地方刚好它这个数下来就是加24了,因为它这个是位,那你三乘以八不就24吗?你看七零加上一个24,你看是不是就是进一位再留一个八呀。
09:13
那问题来了,说老师,那你这个指向哪里呢?各位同学,它指向的地址其实是这个。它会在这里指向。另外。注意听。我给大家画出来。好一个空间。好,我在这里把它分割成三个空间。好一个空间。走。在一个空间。好注意听啊,注意看。那么这个地方是一个一位数组,这个一位数组里边刚做完的时候,其实它默认值都为零。因为你还没有给他赋值嘛,所以它是零。对不对,那么此时此刻我们第一个这个指针其实就指向这个空间的手地址。
10:03
好,为了好看,我干脆把这个换成一个浅色的。啊,这样浅释我就看的比较明白了。好吧。没有没问题吧,这个这个内存这块我们把它标成黑体的,这样看起来就轻松一点。看到没有,它指向它,那也就是说你的这个一位数组,最听你对应的第一个一位数组,首地值其实也是这个位置,也是这个值。能理解吗?就是它刚好其实指向的就是这个一位数组的首地址。这个其实很好理解。那我把它呢,也给大家放到这来。好,其实它就指向这儿的,那后面还有地址,就是以此类推了嘛,对吧,后面还有地址就依此类推,我往这个往后面拿一下。好理解吧,就是这个指针就指向它,那这个地方这个线啊,这个线看的有点不是非常的清楚了,但是还可以,还可以指向它了,那同样的道理,有些同学说老师那是不是意味着另外还有一个空间是给它指向的呢?
11:10
没错,如果你这么去想就对了,因为这个空间我有点不够画了,所以说我只能往这边移动一下,那这个呢,同学们看到。他。他。就这个家伙,他指向的是另外一个地址的首地子啊,另外一个一位数组的首地址。好,我把它标成一个好看一点的颜色,好吧,那这个手地址是多少呢,就它。大家看。是不是这样就一下一目了然了?哎,它指向的是另外一个一位数组。好,可以了。看这么一个关系就成立了,那你看一下为什么他们刚好相差这么大呢?其实你可以算出来的,你可以算,因为这是。一个int,它占八个字节。再来一个int,又占八个字节。
12:01
对吧,再来看它又占八个字节,那不是刚好24个字节吗?那24个字节你看七零加上24个字节的话,刚好等于288。是吧,因为它这个,呃,一个一个INT8个字节嘛,一个INT8个字节,那你三个int就是24个字节,所以说你看这七零再加一个24个字节的话,刚好等于288,就这么算出来的,是不是这样算出来的,那有些同学老师你能够给我证明一下这两个地址确确实实跟他一样吗?没问题,我给你们打印出来看一下,为了让大家确实感受到是这么回事,我给大家打印出它的一维数组的首地址。看到。它的第一个一位数组是不是这个值啊。是不是他的地址,他的地址是不是应该这样取。是不是就说他的首地址刚好是被他指过来的,那同样道理。这个。
13:02
第二个元素,第二个一位数组,它的首地址是不是它。你看你会看到同学们,你看到你会看到这个的地址和这个地址是一样的,而下面这个地址和这个地址也是一样的,我们来输出看一下。同学们请看效果。看到。诶,有同学有没有注意观察到,你看这个地址。和他是完全相同的,这个是288,这个也是288,是不是证明刚才老师说的是正确的呀。是不是就证明我们画的这个图是正确的?好,其他的我就不再多说了,大家看这个图,其实已经把它分析的非常清楚和到位了。应该没问题吧。也就是说它为什么相差24个字节呢?就是因为一个int占八个字节,那三个T呢,因为你一个数组,你一个数组是三,你一个异位数组里面有三个in特嘛,所以说就刚好是相差24个字节,那有些同学老师你给我改一下,看看是不是我可以给你们这样改一改,比如我把这个改成二。
14:05
我把它改成二。如果我把它改成二的话,同学们,那就说它的一维数组里边,里面每一个只有两个int,那就应该相差。16个字节,那也就是说这个地方的一这个这个地址和下面这个地址应该相差16。是不是相差16呢?我们来运行一下。是不是跟老师说的一样,是不是相差16看一下。我们来看看是不是老师分析的有没有道理啊,大家看这里。你们看这地方是A0。这是A0,如果在A0的基础上再加一个16,是不是进一位A变B,这地方还是零呢?是不是老师分析的一模一样啊,甚至有些罗老师那我还有点看不清楚,你把这个改成一,你试试看,如果你把它改成一,当然这个地方就就越界了啊,你就不能这样去改了。对吧,你就这样,只能这样子了。啊,你看如果你把它改成一,那么这两个地址其实就相差八个字节,看对不对。
15:06
这样一看就看得更清楚了,你看同学们看这里这个是不是五零呢,在五零的基础上。你看在五零的基础上加了一个八,不就五八吗。是不是好了,那这块我相信同学们应该理解的比较到位了,因为我都已经这样讲了,你们。必须听清楚对不对,好了,我们接着往下看,那如果说我在这里做了一个A2211,那我改变的是哪一个呢?他是这样找的,他首先找到二二里面的第二一个。元素的指针,那也就是说二一其实就会找到谁呢?找到这这个老师点中的,然后找其中的下边为一的这个元素是谁,是不是就它呀,是不是它把它改成十。因为你下标唯一其实就是第二个元素了嘛,所以说你这样一改动,你会发现你输出的值就是谁呢,就这样子的。
16:04
好,我们再把它打印一下,你这样改完了过后你们注意观察。这样子会出现一个什么情况呢?就是这样子的前面。第一个元素仍然是三个零啊,第一个一位数数还是三零,下面后面这个呢是010和一和零好,看一下老师分析的有没有到位,跑起来请看效果。我们可以看到,我们可以看到跟老师分析的是完全一样的,看第一个元素。第一个元素不是一个一位数组吗?第二个元素又是一个一位数组,但是这个被改成十了,这个老师刚才分析的怎么样,完全一致。完全一致,好了,同学们,那通过这个分析,我相信同学们对二位数组理解的比较到位了,我把它给同学们整理到笔记里面去。好,就这段代码啊,就这段代码,为了好看呢,我把它整体往这边挪一下。好吧,这样子我把它挪到上面去,这样我比较好截图。
17:03
好吧,大家看懂了。能看懂哈。并不难。好,我整体把这个二维数组在内存的布局的示意图给大家板述一下。哦了。没问题了。好,同学们,那么这个呢,就是我们二维数组的第一种使用方式,包括内存的分析就说完了,我们看还有一种使用方式,接着来看,那么除了刚才这种使用方式之外呢,我们二维数组还有一种使用方式,就是直接初始化拿来使用。也可以的,你比如说。VR数组大小我就不说了,类型后边呢,这个地方也可以指定大小,类型后面直接进行初始化。就说我在定义的时候,我就把这个值初始化给你,然后呢,当然后面也可以再改,当然也可以不改,不改的话呢,就跟上面这个值是一样的了。对吧,上面指是一样的,就说你可以改也可以不改,然后使用演示,好,我们把这个给同学们演示一下第二种使用方式。
18:04
啊,包括下面这个,呃,我们我们先截这一部分吧,好吧。调整思路啊,同学们,这是我们讲的第二种使用方法。给他来一个二号标题。好,这是我们的声明。板书一下。赋值。但如果你不赋值的话呢,它就保持上面这个初值使用演示。来,朋友们,我们同样写一段代码来演示它的使用。好了,来走一个VR3。那么这个时候呢,为了简单一点,我还是用二三好吧,因为这个也比较简单,然后呢,我们直接这样做二。三同样把类型写好,里边我们直接初始化,初始化的时候。注意听,因为你你有两个一位数组嘛,每一个一位数组有三个元素,那就这样写一二假设我就直接给了值了啊逗号。
19:04
OK,里边我们再来写,比如说456,那我问大家一个问题。我问大家一个问题,这个时候我输出来是不是就是其实就是这这这个东西啊,是吧,我给同学们输出来,我也不去改它了。PT好,直接输出R3。好吧,直接输出2V3,为了让大家看清楚呢,我把2V3给大家提示一下。好,同样为了好看,我在前面输出一个换行符。输出一个换行符print,好,同学们,我们跑一下走起来。我们可以看到,他跟我们想象的结果是完全一样的。没问题吧,没问题。就是初始化直接在使用no problem,好,这是老师说的又一个使用,我把这个使用呢给同学们复制一下。
20:01
板述一下啊。好的,把它板说到这里。我把它板书到这里啊,同学们把它板书到这里。那么除此,除了这种使用方式呢?其实二维数组还有另外的几种方式写法,大家了解一下就可以了。了解一下就可以,他这样子,大家看他也可以,这这这种写法是刚刚讲过的,不说了。还有呢,就是数组名,这个看的有点不清楚是吧,同学们,我把它标成另外一个黑色吧。这样大家是不是看的清楚一点,对吧,它是这样子的,也可以这样子,前面这个大小呢,你不写点点点有点像一位数组,让他自己去算,你这个到底这个二位数字里面有几个元素。啊这,但是这个大小不能省略了,这个大小不能略,因为这点点点呢,它可以根据你附初值的时候,知道你一共付了几个元素进有附了几几组,这样他他就能把这个点点点推导出来,能理解吧,比如说我在刚才这个写法的时候呢,我可以这样写。
21:07
我可以把这个地方。写成点点点也是可以的啊,也是可以的,好这是一个,然后呢,接着看下一下一个,还有一种写法呢,是数组名直接VR数组名大小就这样写,就说我。损略前面这一部分也可以,因为这地方。你后面这个值是什么,他直接就可以把这个具体的数据付给他,他自己也就接受了,也就说可以省略前面的这一部分。可以省略。对吧,亏损点这无所谓,就好比刚才老师这种写法。说老师说,诶是我我不这样,我直接把它去掉,可不可以也可以啊。也不会报错。也不会报错对不对,甚至你还可以这样写,你把这个VR去掉,但是你把VR去掉过后呢,你就必须给一个什么呀,给一个这个冒号,这样呢叫类型推导。如果你保留VR好,你这个地方就可以不要,这个在前面讲基础的时候,其实老师就已经给大家全部讲过了,我这就不再赘述了,好吧。
22:10
好,大家记住有这么几种写法好了,我把这一块呢,也给同学们整理到我们的笔记里边去,没问题吧?好,同学们,我把它放到这里,就是还有几种声明我们二位数组的方法呢,也给大家说好,说到位好可以了。好了,那最后呢,这个我们讲的这个二位数组,还有一段代码给大家整理一下,就是前面这段代码,诶这个代码是不是已经结过了呀。啊,截过了,就这块还少截了一点,就是怎么打印出他的地址,这块我没有给他截下来好。我把这个土形截截完整一点。是不是前面我我有这么一段代码,打印出它的内存布局的时候,我还有几句话,打印出它对应的地址是吧,有些同学可能需要看到这个东西,所以说呢,我把这再截的全全完整一点。
23:03
从这开始截取对不对。好,整体把它放到下面来。啊,放到上面也可以放到下面吧,放下面。OK。好,整理好。好同学们,那么这个图就是上面我们的内存图对应的怎么输出这个地址,这个地址怎么拿到的,就下面这句话大家看清楚了,好同学们,那关于我们二维数组的一个应用,就是它的两种使用方式,包括它的内存布局呢,我们就给大家介绍到这里,后边呢,我们就来讲一些二维数组的应用和它的一些注意事项。
我来说两句