00:00
同学们,我们再来看一个指针数组,诶,这个级别就高了哈,我们前面讲过int数组,诶,讲过float数组。对等等,对不对,现在呢,我们要讲一下指针数组,也就是说我们这个数组里面存的是什么呢?存的就是指针呢,简单说一下,什么叫做指针数组。呃,要让数组的元素,如果要让数组的这个元素指向int或者其他。数据类型的指针。就是我我这样说吧,他这应该说的不是很具体,应该这样说,呃,就说要让数组的元素。指向int或者。或者其他数据类型的。地址哈,这样子地址,因为地址就是指针嘛,就是它的元素是个地址值了。这样这样写应该更好一点啊。
01:00
地址。那你这里面存的就是一个字地址,这个地址呢,其实就是一个指针,明白这意思吧。待会儿我画一个图就明白了,那么就可以使用指针数组。就可以使使用指针速度,也就是说打个最简单比方,我们看一个案例,比如说同学们看啊。我们这儿有一个数据类型。数据类型,然后呢,这个地方是指针数组的名称,后面写个大小。你比如说我有一个int星PTR3。比如说这样写的啊,那么怎么理解这个东西呢?那么PTR就被声明成为一个指针数组了,它这个PTR啊,PTR就是一个。指针数组。PTR就是指针数组,那么这个指针数组是由三个整形指针组成的,因此,因此PTR中的每一个元素都是一个指向int值的。
02:03
指针。好,这个那是老师有点还是有点不明白。呃,这个要要是还是不明白的话呢,咱们举个具体例子,画一个内存图好吧,还是要看画内存图来帮助同学们理解,比如说现在呢,我们来看一个指针数组的快速入门和内存布局的示意图,我们就以这个为例好吗?来各位同学。我现在呢,咱们直接拿这个来分析好吧。咱们直接拿这个分析,咱们就不啰嗦了。把这个代码呢,咱拷贝过来。就就以这个为例来看看指针数组到底是呃怎么回事啊,好,我这样子啊,我把因为这个图待会其实是很有用的,这个这个图很有用的,我还用这个图来讲,好吧,我把这个呢复制到咱们的下边。因为得有一个图来说明,不然的话你听不懂,呃,一个是你听不懂,第二个我我也讲不明白,明白吧,好,我们先来看这个代码,它是,呃怎么形成一个指针数组的呢?首先第一句话这个没什么可说的,当我们当我们这句话执行完毕以后呢,就会在内存里面搞一个这个东西出来,是不是。
03:13
没问题,然后这有一个for循环I,好,关键是这里星号PTR3会形成一个什么事情呢?各位同学看啊,此时此刻这个就发生变化了,它这里面呢。就是一个宿主了。好,我把这个呢,把它放到底层去。好,哎,放到底层还不行。嗯,放到底层还不行。那这样子,嗯,我想想怎么放哈,因为这个这个图嗯。这样子我先。我先这样释放啊,把它放到这儿。把它自底。置底过后呢,把这个黑色的再织一下底,它就应该看到这个颜色了,好,这样就对了,这就可以看到了,它是这样子的,同学们。
04:04
就是这这个地方呢,现在还没有赋值哈,还没有赋值的话,这个线肯定是没有的,到时候这个地方呢,它会存一个地址。明明白这意思了吧,好,这是地址一,但是现在你因为没父子不知道指向哪里的,那这边呢,也有一个地址也要也也有还有一个元素是个地址二,明白这个意思了吧,然然这边呢,还有一个地址三。他现在也不知道指向哪里。同样了,同学们,那呃,那你这个地方有地址,那同学们想一想,是不是我这个地方也应该有相应的地址啊,诶,当然我们可以看一下地址,它这个地址相差多大好不好。那你想一想,你这个地址是是指向这个int的是不是,所以说呢,这个地址呢,也应该是在前面这个地址上加一个四,那这个变变成几了呢?变成六了。能理解吗?好,那这边呢,再往这边移动哈,再往这边移动。下面这这个第三个地址,它本身的地址空间呢,就是一个A,因为六加四不就等于A了吗。
05:07
好,这个PTR呢,这个PTR,它就指向我们的这个,指这个指针数组的第一个元素,呃,说的再直接就直接一点,就这个地址明白了吧,说这句话执行完毕过后呢,就变成这个了,那我们接着。看下面这句话,下下面这句话,大家有没有发现它其实是在循环,这个max是等于三的。那它循环的时候呢,就把这个。就把我们这个VR里面的每一个元素的地址赋给了我们各个指针数组里面的元素。的,嗯,这个这个位置说的再直接一点,就是这这个for循环执执行完毕过后呢,它赋值为整数的地址,说白了就是把这个第一个地址复成了。0X1133看懂了哈。
06:01
那当然这样一一做的话呢,这根线就连起来了。就说我们这个。就指向了他。能理解吧?那么。哎,写啊,不好意思,好,然后这个地址。就把第二个元素的地址,因为这个I在不停的变化嘛,I累积一下变成一,就找到第二个元素的地址,这个元素的地址呢,就应该是0X。三期,那显然这个之间的关系呢,也构成了。好看看懂了吧,当然了,那这个第三个地址就应该是我们上面的第三个元素的地址放到这面来了。诶,这个。这个不行啊,它是一个图片的变成一个不知道为什么好,我在这再复制一下。好,那当然这根线呢,也就形成了。明白这个意思了吧,好,我们管这个叫什么呢?就是我们管这个东西。
07:00
叫做指针数组。为什么管它叫指针数组呢?因为你原先如果只有一个的时候,我们叫指针,现在你这个PTR代表的可不是一个指针,可是多个指针呢,所以说就叫指针数组,明白了吧,那明白这个道理过后呢,大家看这面它又循环。它这个时候呢,又是从I循环到三,然后这个value,你看它这怎么取的呢?诶他说我要取出这个值,但是呢,我是用这个指针数组去取的,这个时候使用指针数组。指针数组来获取各个各个值,那它怎么取的呢?大家看VR白毛D,白毛D呢,这边就是I嘛,等于零嘛,然后大家看这个值是星号PTR,这时它就没有没有用这个什么,这个PTR加加这个东西了,没有了,因为我们这个值同学们看PTR。I等于零的时候,相当于取出了PTR00这个,这是个指针啊,同学们。
08:05
相对说取出这个指针指向的指,那显然取出来就是十喽,然后呢,这个地方再便利一次,这个I就变成了一。变成一,这个PR,一显然就是我们的这个PTR指针数组的第二个元素里面这个值指向的这个值对不对,那显然就是,呃,就是100又取出来了。其他意思类推,也也就是说现在呢,我们可以直接通过PTR这个下标来取出这里面的各个地址,然后再前面加一个星号。星号不是取值符吗?然后就取出了这个地址对应的或者指向的这个值,那显然这边就应该得到的是,呃,十。是100和200,我们运行一下好不好,其实这个挺简单的。只要把这个图一画就很简单,如果我不画这个图的话呢,光靠语言描述,我估计同学们应该听的也很郁闷,这个图很重要哈,各位同学,那这样子我们运行一下看看效果就可以了,其实没有什么难度。
09:12
听起来很吓人,其实很简单对不对,听起来很吓人,其实很简单,关键就是讲清楚就可以了,Power指针是不是我们这是我们的第一个案例吧,也也也许后面还有,哎,走到这,那同样道理呢,我把这个给它注销啊,去掉,然后呢,我们这里写一个include include sddl,没问题的同学们把它往这一粘就可以了,那如果说呃,这个max我忘写了,Cost max g3。啊,当然这个常量呢,咱们得有一个类型,对cost。哦,我们看看以前这个定义的是按多少值来定义的哦,就是33,那前面我们把这个类型加上就可以了。等号不要忘了啊。
10:00
好,这这个地方呢,咱们就是三,那现在这个输出来,如果不出什么问题,应该是十一百还有什么呀,200是这样子吧,同学们来运行一下好不好。OK。我们运起来过呢,可以看到的确是这样子的,对不对,哎,的确是这样子的,看一下,诶这个为什么错了,看一下。哦,这边应该没有注销。那这边有没有住校?好,这边都注销了,注销过后就没问题跑起来。跑起来,OK。好,我们跑起来过后呢,我们发现的确,诶这个不好意思,又忘了get char对不对。又忘了一个,要暂停一下我们的控制台。运行吧。那并起来过呢,我们看见现在应该是没有没什么毛病了吧。对,十一百和200,那这样子,我们顺带把这个地址也打出来,看看地址是不是像刚才老师所分析的那样,也是相差四个字节,就是这个地址和这个地址是不是相差四个,我们打一下好不好,反正就讲到这了,我们把地址打出来就是嗯,PTR这个。
11:10
白慕号D。的地,他存的存的地址啊,存的地址。啊,它它本身的地址吧,这个纯的地址咱们肯定是不用怀疑的,不然你取不出来PTR它本身的地址。本身本身的例子。本身的地址,本身的地址,我们现在要打的是哪一块,先说清楚打的是这块上面的这三个。好吧,我们看看这三个是不是他们也是相差四个字节,这样来算的,OK。嗯,来证明一下这个事情本身的地址呢,咱们就百分2P。对,隔一下。啊,这边有个换行符,换行符呢,咱们挪到最后吧。然后这个要把它的地址打出来,是不是直接p tri就可以了,你不要再写星号啊,再写型号就是取出它的值了,这样就是取出它的本自己本身的地址,那么这个本身的地址呢,你还得这样取才行,如果你不加,呃,如果你你这样取的话,各位同学你这样这样取的话,其实取的是哪里的地址呢?是他。
12:20
这这个框框里面的地址了。能理解这意思吧,因为你现在我们要打的是上面这个地址嘛,所以说你要怎么取才取出来本身地址呢,加个艾。你明白这个意思吧,啊,这个大家应该应该能理解了,如果你不加这个。取的是PTR。这个I对应的它,它存放的那个地址加一个I的符,就是它这个变量本身的地址,这个我我已经讲了很多遍了,我就不再多说了,好不好运行起来。因为这些,诶,我不好意思把这个关一下。好运行起来。现在运行起来,我们看看是不是相差四个。
13:00
跑起来哦,看一下我们可以看到现在呢,他这个地址跟我们想的诶。怎么是在前面呢?好,我们看看是不是地址输错了。哦,这边应该还少了一个,少了一个I,对不对啊,少了一个I,因为这个地方是不是还有一个。嗯,下标没有输出啊,应该有个I在输出,对的再跑一下。跑起来,同学们。稍等一下。抛起来过后我们看看是不是跟我们想的一样好,各位同学可以看一下。P0的本身地址是0404加一个四就是0808加一个四就是0C可以的完全正确,好完全,也就是说我们这个图画呢,没有错,要确定一下。好,各位同学,关于指针的这个内存布局,还有快速入门,说到这,我们紧接着再看案例吧,我们就一次性的把指针数组讲完,那么他说呃,这里面有个指呃,指针数组的应用案例,他说请编写一个程序,定义一个指向字符的。
14:05
定义一个指向字符的指针数组啊,应该是指指字符串啊,它这个应该是写错了,指向一个字符串的指针数组。来存储字符串列表,因为你你这个指针是指向一个字符串的嘛,所以说应该就是字符串指针的,就圈新也可以叫字符吧,因为字符串。指向指向字,指向字符的这个指针其实就是字符串了,就是圈心嘛,说白了就圈心,然后呢,四大名著,呃,这个存的是四大名著,并通过遍历。呃,遍历该指针数组显示字符上的信息。这句话听起来有点绕口。听起来有点绕口,说的再简单一点,就是咱们定义一个指针数组,这个指针数组的里面的每个元素呢,指向的是一个字符串,就这个意思,我再解释一下,简单说一下啊及它这个题给的有点绕口,这样子集要给及干什么呢?定义。
15:08
啊,定义一个定义一个数组指针。啊,指针数组,指针数组。指针数组,那么该该数组的该数组的每个元素啊,每个元素干什么呢?指向的是。呃,每个元素是指针,肯定是指针呢,干什么呢,指向指向的是一个字符串啊,这样这样子就容易理解了,好那么每个字符串是他的,嗯,一个红楼梦,一个三国演义,一个西游记,好同学们我们写一下,我给同学们写一下这个代码,好,代码非常简单,我们来编写一下来。各位。同样,我们现在呢,再写一个小案例,叫pointer,一个case。Pointer。的一个什么呢?案例case。
16:04
好,跟上老师思路。跟上老师的思路。现在呢,我们来做这个代码哈,Include std没有问题。I我们引入这个头文件,引进去过后呢,我写一个V的主函数。那现在呢,我们根据他的要求。他说定一个指针数组,该数组的每一个元素指向一个字符串,那就应该怎么定义呢这样写了。能看懂吧,Char,好,现在呢,我们叫books吧,叫不等于来吧,那现在因为是个数组,那就不客气了,这样写。我就直接写东西了啊。因为他每个是一个。每个字符串,所以说这就是三国演义。三国演义。啊,三国演。好,第一个OK。第二个再来看第二个呢,是西游记。
17:03
没问题,也写进去了。第三个是红楼梦,红楼梦。OK,再看最后一个,最后一个是水浒传,水浒传。这样啊。水浒。就可以了。水浒传。好,那这个就写完了,写完过后我们可以看到此时此刻它报错的原因是什么呀?是因为你这方是一个指圈,呃,是一个指呃字符指针,但实际上呢,它不是数组,应该怎么办呢?诶,咱们得加一个中括号就可以了。你加一个中代表这个不呢,它就是一个指针数组了,而不是一个指针。好,现在呢,我们来便利。变历,那遍历的时候呢,我先定一个I,再定一个认识,这个认识呢就是四啊,就是我们一共有四个元素,就可以开始变历了,For循环I。I等于零吧,I小于N没问题吧,I加加。
18:05
爱加加,然后呢,我们就可以输出了,怎么输出呢,来看一下,呃,我们。我们怎么写啊,就这样给大家写一下吧,写个n books。好,然后这边呢,我们写个D,好,然后他说指向的,呃,指向的这个字符串是字符串是什么呢?输出来没问题吧,就说实际上是他这边有个地址是指向这个字符串的,待会我们画一个内存图。子阳的支票是什么呢?我们把它拉过来。那这边就是I了,那这这个值怎么输呢,就不可是走I。就行了。对,这个地方呢,有一个问题哈,你要这么去输的话,其实输的是这个指针数组里面存放的地址,因此呢,你还得有一个。这个符号。这样子是不是我们才取出了它对应的这个内容啊。
19:03
这个大家能理解不?诶你要是说只输出这个,那就是个地址,明白了吗?好,我们把它取出来,好这样取出来过后呢,我们来给大家,嗯,每次输出啊,来一个get唱。开始查一下,开叉过后各位同学,现在我们就可以来运行了,我们看看输出的效果跟我们想的是否一样。对吧,我们运行。运行,看看是否输出了三国演义、西游记和红楼梦。这四本书的名字。好,我们可以看到现在出了问题,出了问题是哪里出了问题呢?大家先想一想,哪里出了问题?好,我们来想想问题是出在哪里。我们这边的问题,大家可以看到哪里有问题呢?大家仔细看一下。我觉得这个问题是这我们这个地方不能加星号。不能加星号。
20:01
为什么不能加星号,我们先运行一下看看结果对不对,我给他分析一下为什么哈,来走一个先先运行一把看效果。看看这个时候他是否输出了正确的信息。我们现在看一下。好,我们现在可以看到,诶现在是没有问题,你看三国演义西游记,红楼梦水浒传,那为什么现在这个不需要加新号呢?大家理解为什么不能加星号吗?大家还记不记得?我们我们这样去写,因为字符串它的名称本身就代表它的一个首例值,大家还记不记得,我们是以以前做过这样一个东西,大家大家这样理解就很好理解了,比如说我写了一个char心。HTR。PPR等于。ABC。大家看。是不是也就是说其实我们在给的时候这个PTR。它其实呢,就已经指向了这个字符串,你看我们在这个地方输出的时候,实际上我们也没有加星号,这样大家一下就明白了,你看我这里写的是PDR。
21:10
PTR。PTR指向的。哎,指向的这个内容,我们是不是将输出的,实际上你在输出的时候,你也是直接。这样就可以了,你并没有在前面加个星号,对不对,你加星号反而就错了,说的这个道理呢,是一样的,我们保存一下,运行一下,看效果是不是也输出了我们这个ABC。就是这样一个道理。所这个地方呢,我们不能加星号了啊,它比较特别,你看是不是我们输出了四次p string指向的是ABC啊,那你要加个星号就完蛋了,这个啊,你加一个星号,你看这个时候呢,就会报错了。他跑错,你看跑起来看效果。对,所以说这个地方我们不能加星号。哎,这个是不能加信号的啊。跑一下你看就报错了,一会呢,就会出现一个提示,说我们这个程序已经终止了,原因就是刚才老师讲这个道理好吧,所以说明白这个这一点就行了,以前我们其他需要加星号一一般是这样写的吗?比如说我有个星,比如打个比方我有个number这样写的。
22:19
十对不对,然后呢,我有一个指向number的,其实是这样给的。对,然后呢,这边给了一个at number,而现在不一样,现在字符串是直接把这个字符串常链就给到他了,所以说你在取的时候呢,不需要再加信号就可以,好吧,这个大家理解就行了,我这里就撤回去了好吗?把上面这个留下来。大家理解就OK了。不明白的地方,如果确实再不明白的地方呢,把老师前面讲的那个字符数组拿出来看一下就一目了然,好吧,没什么难度,好,各位同学,那关于我们这一个指针数组的应用案例呢,就给大家讲到这了。现在呢,我们把指针数组内容就讲完了,我们梳理一下讲解的内容,那指针数组我们讲了哪些,梳理梳理。
23:07
跑一个哈。我们看一下指针数组,我们讲的是哪些内容呢?首先说了一个指针数组的基本介绍。对,我们先说了指针数组的基本介绍,然后呢,说了指针数组是如何定义的,这个基本语法大家一定要有印象。对,要有印象。好,标成一个蓝色的啊,这边呢,我们说有一个基呃基本的使用情况梳理了一下,然后把这个讲完过后呢,同学们是不是老师就马上给各位同学举了一个案例啊,就指针数组的快速入门案例。对,那么快速入门案例呢,我们在这里是不是把这个代码在这写的呀。是不是这个案例没问题吧?把这个案例呢,给同学们拿过来拷贝,拷贝到哪里去呢?拷贝到我们的笔记中去。这是我们的一个案例。
24:02
那同时呢,我们也画出了它对应的图,对应的。对应的内存图就是指针,指针数组的内存布局,这个很重要,如果你不理解内存布局,那听起来就很就很郁闷了,我把这个图呢,给同学们截取到我们的笔记中,拿过来放到我们这边。完事好,紧接着我们又讲了一个什么呀,是不是为了加深大家对指针数的理解,我们举了一个。呃,应用案例。对,我们举例举例应应用案例,那应用案例的代码呢,给大家拿过来就行,在这里是不是同学们。所以我们对于这种字符串指向字符串的这种指针呢,咱们就不要再加星号了啊,你加信号会错的,就把这个信号去掉,是不是加信号是要错的。我们这边也把这个去掉,刚才饰演是一个错误的,对不对,你取的时候就不要再加,为什么呢?因为我们这个字符串它会这样做的。
25:01
他是。他是找到我们这个地址,直接就取出来了。所以说不会再像那样子绕一圈了,好,各位同学关于这个讲解呢,我们就给大家说到这里,好吧,关于指针数组的内容就给大家说到这里。
我来说两句