00:01
同学们,我们再来看下一个内容,叫指向指针的指针,又叫多重指针。那么什么叫做指向指针的指针呢?我们先来看它的一个基本介绍。指向指针的指针是一种多级间接寻址的形式,这里看到多级间接寻址。那么什么叫做多极间接寻址呢?呃,你可以这样理解,你可以把它把它理解成是一个指针链,通常情况下是不是一个指针包含一个变量的地址啊,就是像这种情况。这有个指针,那么这个地方存在一个地址,这个地址呢就指向一个变量,一般是这样子的,当我们定义一个指向指针的指针时,第一个指针包含的是第二个指针的例子,就这个是第一个。OK,那么这个。这个指针。这个指针的地址其实放的是第二个指针的地址。
01:01
那么第二个指针指向包含实际指的位置如下面这个图,那我问大家,我问同学们一个问题哈,针对这个图,哪个是一级指针,哪个是二级指针,能告诉老师吗?显然这个是一级指针,因为它的这个地址就直接指向了这个指针,对不对,那这个呢,就是我们的二级指针,为什么呀?因为它这个地址并没有直接指向指,而是指向的另外一个指针。好,那这个,呃,这个基本介绍说完过后呢,为了让大家有一个更加深刻的认识,我们来一个多重指针的二级指针快速入门,我这里只讲一个二级指针就可以了,三级指针四级指针的使用方式和二级指针和二级指针大同小异。那么我们先来看这么一个案例啊,郭同学。首先有几个点要先跟大家讲清楚,一个指向指针的指针的变量,就是一个指向指针的变量,必须像这样声明,前面呢得带两个星。
02:08
啊,这个地方我把它。换换一行,这样好看就是int新新PTR,也就是这种情况下,这个PTR它。它的存储空间存的值呢,就是一个指针的地址,而不是一个变量的地址了。这个就是二重指针,就说你可以认为你可以这样理解。就是PTR的类型是什么呢?是新int新星,别人这你只要这么一说别人就知道哦,PTR是一个二级指针。那么第二个,当一个目标指针被一个指针间接的指向到另外一个指针时,访问这个值需要使用两个星号运算符,也就是说我也也就是说,嗯,我们要从二级指针去取到这个值,应该写星号,星号PTR。
03:04
就是你要用两个取值符。好,这样讲的过程大家可能还是不太明白,我看这边的图,比比如说我通过这个指针要去取得这里面的指,其实我只要一个心就可以了。星号P就完事了,但是如果我要通过这个指针去取到这个value,那我就得有两个星,那第一个星。这个是取的什么呀?取的它这里面的这个地址。然后再取一个心,才取到这个value,明白这个意思了吧,很形象,那各位同学我们直接给他上个案例就完了,再画一个内存图好吧,那各位同学,我们现在呢,写一个多重指针。好,我新建一个文件好吧,Multi。Multiply。这样就是多级的什么,我简写multi,然后呢,Paul DEMO好吧。
04:05
好,现在呢,我们在这里给大家。写一个。MU。Itl u it好,就它吧,就它。井号。HTDIO。然后呢,咱们写一个。函数啊,这个函数就不需要了,因为整个这块都有。呃,我们来看一下这个情况是什么样子的,还是老规矩,我们把这段代码呢拿到这边来,给大家画一个示意图,大家一目了然,好吧,非常简单,一句话一下就就能讲完。好,我把它先放到这里,大家跟上我的思路,然后呢,这边嗯,不行,这个嗨。这个还得用。我们的记事本把它乱码处理下。来看一下。在这里哈,然后呢,我们这边呢,仍然有一个内存。是这样子的,同学们。
05:01
好,这是我们的内存,那这个内存呢,我们这样来处理一下就可以了,来首先呢,我们看这个VVR变量,这是一个,当然这是个,这肯定是个整形啊,这个变量我不说了,这是个指针,这个是个一级指针。一级指针。就是我们前面学的那种普通指针,这个就是一个二级指针。为为什么它是二级指针呢?因为它有两个星,看到没有好,这个是一个值,VR33400个值,也就是说在这样一个情况下,我们这个VR指向了一个。什么呢?指向了一个空间。好,咱们可以从上面拿一拿一份,好吧,简单的快速的来一份。好,这边呢,有一个这个符号。对,那这里面呢,现在只有一个变量对吧,我拿一个就可以了。好放清楚了啊,放到这儿。放这,那么现在这个值,就是现在这个VR里面这个值是多少呢?3000。没问题吧。同学们,3000。
06:02
那三千三千完了过后,这边是不是他也他也有个地址,我这就用这个地址吧,咱们就省点事好吗。好,现在这个地址在这里。好0X1133假设,那现在这边我们也给它插入一个箭头,这样我好比划好,这样就到这来了,那到到这个地方我们有一个一级指针PTR,现在呢,PTR现在还不知道指向哪里,所以说我们这写着呃未知好它当然它也有空间了。但它也有空间,我就再复制一份过来。放这儿。那么这个这个PTR,现在它肯定是有个地址的,比如说我写个0X1144吧。假假设这么写,他现在这里面这个值呢,肯定是要存一个地值,现在不知道是多少。明白这个意思吧,好,现在也就是说我们这个PTR呢,指向了这个空间。
07:00
能理解好,再来一个二级指针PP。Str,那这个PPSTR呢,咱们可以这样来这样来玩哈。好,为了方便呢,我在下面再写一个,好吧,再写个PPTR,这个PPTR呢,它也指向一个空间,好,我们先把它放到这来。复制一份。往下拉,那现在呢,假设它的地址是0X1155,假设哈,它这里面也会存一个地址,但是要知道这个地址是一个指针的地址。这个地方就不是一个变量的地址,他要存放一个指针的地址,这是规定好的,就说你不能说,哎,我让它指向这个边,它类型不匹配了。好,这个写完了过后,我们看下面这句话,P这个句话大家能理解什么意思吗?它是把VAR这个变量的变量的地址付给谁啊,付给这个PTR,也就是说现在这个地址存的就应该是0X1133,这个能理解,那一旦这个。
08:09
负了,负完值过后呢,这条线就连起来了,你可以认为它们之间已经有一根连线了。明白。紧接着他又做了这样一个动作。这个是表示什么呢?这个表示将这一个PTR存放的,存放的这个地址付给谁呢?OK,付给付给我们PPTR,换言之就是它会把这个地址哦,注意不是这里面这个地址啊,是这个地址能理解吗?是他的0X,呃,1144放这,而且只能放这种类型,你你不能说,诶说老师我能不在PPTPPTR里面把0X1133放进去,这个是不允许的,因为类型不匹配好,这样子,呃,一旦放好了功能这个线就连起来了。
09:01
明白了吧,好连起来过后呢,我们看这里这里它VR的地址,嗯,那我问大家一个问题,现在VR的地址是这样输出的值,那这个地方如果按我们这来看的话,这个地方第一个应该输出的是0X1133。然后那个值显然是3000。没有问题吧,好,我们再看PTR本身的地址,PTR本身地址就是它了。能理解吧,然后呢,PTR存放,存放的地址就是0X1133。这个能理解吧,就是如果,如果这个PTR本身的地址就应该指的是这一件。好,那么PTR存放的地址呢,就应该是这个0X1133,那么星号PTR,那显然它用一个星号就能取到3000了,所以说这个地方应该是3000,就这个能理解不好,然后PPTR的地址呢,2%这个取,这样取取的是谁的地址啊。
10:01
就是这个地方应该输出的是0X111155。PPTR存放的地址这个0X1144,那么它这用就不用再取地址符了。PPTR就代表取出自己存放的这个值,就是一个地址,就是一个指针的地址,那星号星号PTR,这个相当于是取过一次再取一次,这个呢也应该取出3000。好,代码就说完了,能理解了吗?就这个图,一定要认真的领会,好同学们,我把这个代码给他拿回去,我们运行一下看效果。因为这边呢,有注释对不对。好,跟着老师思路看看,我们验一下看看对不对哈,看看对不对。OK。那运行运行起来,那运行起来过后呢,我们看跟老师分析的是否是一样的。是否是一样的?运行起来,那运行起来我们看一下跟老师分析是否一样,第一个哈,VAR的地址是这个值是3000,这个OK的,大家看PTR本身的地址是这个存放的地址,大家看这个地址。
11:10
和上面这个地址是一个。你们有没有发现002D?呃EB呃EB4002D EB,呃E呃B4对的吧。而而且取的是3000。那么再看PPTR本身地址是这个,它存放的这个地址就应该是哪一个呢?就应该是这个地址。这个能理解吗?你看002D有点看不清楚了,EFA8。看002DEF8好关系就捋清楚了,同样新兴PTR呢,就是它好,这个就讲完了,看看大家理解不?其实一点都不难,对不对,其实一其实一点都不难,这个就是我们所说的二级指针,其实一点都不难,好的,我把这个二级二级针说到这,那我问大家三级指针大家会玩吗?
12:06
三级指针其实也很简单了,如果说同学们将来有三级指针,那你相当于什么感觉呢?就相当于这样子的PPPTR走。OK,那它这个地方存的呢,就是一个,呃,如如果有三级指针的话啊,那这个地方就应该是这样玩的。呃,它当然这个三级指针它有个地址,比如说000X00X1166,那这个地方存的是什么呢?存的是一个二级指针的地址,也就是001155。这样一形成呢,诶,它就。这样子走了。理解吧,那我给大家玩一把,看看咱们能不能玩起来好不好,我们就试一试好不好,星星星PPTR能理解这意思不?那这个呢,就是三级指针。三级指证。能理解哈,那现在呢,我们在这儿再来用三级指针来看看他的情况是什么样的,来走一个。
13:07
对,大家看一下PPPPPTR地址。PPTR存放的地址,它指向的这个值就这样去取,第一个就这样取本身地址,然后呢,它存放的地址还是这样取啊,当然这个地方要加个P了。因为变量有变化嘛,取的时候呢,要这样取,能理解了吧。应该不难吧,好,我给大家再运行一下,看看是否跟我们想象的一样,来各位朋友运行起来。运起来三级指针,那是诶这个代码。哪里有问题看一下。非法的寻址。好,那这个地方要怎么取啊,同学们。大家看你这地方是不是少了一个P啊?你少了个P,你你相当于说二级指针你去取三次,那肯定他就给你报错了嘛,是不是应该是PPPTR,因为你现在是三级指针嘛,三级指针你才会有三个信号,对不对,你如果像刚才这样取,相当于说你对这个二级指针取了三次,那这个肯定就错了,好各位同学我们运行一下。
14:18
看效果。看效果,看我们运行的结果是否跟老师讲的一样好,我们可以看到这有个小错误对不对,我们先终止一下,看哪里出了问题。看哪里出了问题,是不是这个地方我们没有赋值啊,你上来过后,取了过后,你以为你负了,其实没有赋值,是不是还有一个动作忘写了,好刚好借助这个案例给大家讲清楚了,你看你刚才我们我们在这画了一个图,就好像以为连上了这个是不对的啊,我们还要复图纸,PPTR,这个应该怎么付呢,同学们。是不是应该把这个二级指针的地址交给他呀?那就应该写个艾特服务PPTR。是不是这样子,同学们?别写错了,这个表示将谁啊,将这个PPTR存放的意思付给PPTR。
15:08
这样就肯定没问题了。这样肯定就没问题了,跑起来。好,这次肯定OK。来运行。那刚才你的就是因为地址没有赋值,赋值是一个垃圾值就报错了,大家看这个效果,我们再看一下这几个相相同,它和它相同。没问题吧,这个。存放地址和这个本他的地址相同七零,那这个地方的地址0016。FE64应该跟二级指针本身的地址相同,果然是相同的,E fe64嘛,F164完全正确,最后取出来值呢,都是3000。都是3000,好,各位同学,那关于我们这个多极值我就讲到这,好大家把这个图好好理解一下,我把这个梳理一下,指向指针的指针梳理一下。放这儿吧,同学们。还是比较简单对不对,只要讲清楚了,你把这个图搞清楚了,其他都不在话下,首先呢,我们说了一下二呃,这个多级指针的一个概念。
16:09
就基本介绍,然后呢,我们给了一个简单的示意图,就它。给各位朋友拉过来,那么为了加强大家对多级指针的理解,我们就举了一个案例,是不是讲了一个多重指针的案例,这个地方其实我们这相当于讲的是一个二级三级都讲了,对吧?二级三级我们都讲了。好的,我把这个题呢拿过来。把这个拉过来,OK。把它拉过来过后呢,我们这同样来一个标号三。是吧,标号三好,这边有也要也要标个号,三个三句话嘛,三句话。好各位,那最后这个案例呢,我给大家放过来,还有这个内存图给大家放过来,案例在哪里呢?案例其实就是在这个位置吧。我把它放到我们的笔记中去,便于各位同学今后的复习。还有一个内存图,对应的图写到这啊,对应对应的一个内存布局图,这个很重要,一定要深刻的理解。
17:10
一定要深刻理解好的,我呢同样在这边来一个这样的符号,好吧,那这个内存图呢,我们就直接从这边拿过来就可以了。往上面对一下,我这个往下面拿一点。给截一个图给大家。对。跑起来。好,对应的这个内存布局图画到这里,那各位同学关于多级尺寸呢,老师就讲解到这里,大家好好的消化一下。
我来说两句