00:00
各位同学,我们继续来学习指针的其他内容,那么指针它既然是一个变量,所以说它本身呢,也能进行相应的运算,主要是算术运算。指针是一个用数值表示的地址,可以对指针执行什么呢?算术运算,总体来说呢,有这么四种算术运算符,加加减减加减。那指针的算术运算它到底是嗯,怎么来玩的呢?我跟大家举一个案例,好吧,我把这个案例拿过来给大家做一些注释就可以了,因为案例本身呢,其实挺简单的,我给大家一边讲一边解释就OK,来打开我们的项目。打开我们的项目。现在呢,我们再新建一个文件夹哈,现在已经到了第14个了。The chapter。下面的幺四。那现在这是我们指针的一个案例啊案例,那我写写到这了,Paul。
01:05
Pointer的一个DEMO01。好,跟上老师思路。H。否,这个点错了。好,应该是这样子哈,这个CPP就不要了,Point。然后呢,我在这里把它的后缀稍微的改一下。各位同学跟上我的思路,那现在呢,首先我们来一个include std。IO好吧,然后呢,VO。主函数。好,然后呢,我把代码呢,拿过来,我们用一下就可以了,把它稍微的格式化一下,各位同学我们,诶这个地方代码我们不需要啊,不需要这么多。我们这样这样子就可以了。格式化一下。格式化一下。那么来说一下这个这个案例,它讲了一个什么东西,这是一个常量,我就不说了吧,这是个常量,这个常量呢,我定的是一个三,看清楚了,这边是不是个数组啊,哎,这是不是一个int数组,我们学过了,这是一个int数组。
02:08
没问题吧,同学们,那看这个I和星号B,大家可以看到这个PTR呢,它就是一个指针了,对,这边一定要看清楚PTR是一个int。行道指针。这个能看懂吗?是个int新的这样的类型的一个指针,也就它是指向什么呢?它是指向了一个int类型的一个指针,那这个地方这句话代表什么呢?把VAR。付给了PTR,这样子是不是就意味着PTR它指向了,它指向什么呢?诶,它指向了我们VAR这个数组的首地址。这个大家能看到吗,手。首地址对,也也就是说现在如果说我们画一个示意图的话呢,待会再画哈,就是这个PTR呢,它就指向这个数组了,那我们画一个示意图,因为待会呢。
03:05
老师在讲的时候啊,要用这个图来说话,否则的话不好讲清晰,那为了好看呢,我们仍然哈来给大家来一个这样的一个空间。呃,那么这边这个是个PTR。PTR,那这个PTR呢,它指向了一个VR的一个数组,那这个VR呢,它其实是这样一个概念哈,我们我们应该这样写,写VAR,它先指向那个数组。这个数组一共有几个元素,我们看一下一共是有,呃,按照我这写的应该有三个元素,好,那么就写三个元素吧。画三个元素,这是第一个哈。往这边挪一下123。好,我我整三个哈。这三个这样的空间就稍微大了一点,往那边挪一下就可以了。挪一下就可以了,第一第这个元素里面的第一个值是多少呀?第一个是不是十同学们。
04:02
第一个是十,第二个是100。第二个是100,第三个是200,对不对,同学们,第三个是200,那么此时此刻这个VR呢,对这个VR呢,它其实就指向了。它就指向了我们这个数组的首地子。我给他换一个颜色,大家看清晰一点,能看清楚吗?呃,应该能,能,那如果看不清楚,我把这个颜色哈,我把这个背景是换成另外一种颜色,浅一点的颜色,这样大家看着看着应该更更,哎哟,还不行哈,我这个改了不好改。我把它改成黑色,看看好不好看。试一下好吧,改成黑色。这样应该看得更清楚一点,我把这个颜色改成一个白色的。怎么还没有没有白色号。浅一点的颜色吧。就也也就这个颜色了,其他颜色都不好使,就这个颜色吧,也就是说这个VR呢,它指向了一个数组,呃,它本身就是个一位数组嘛,它实际上是它指向我们这个数组的首地址,就是第一个元素的地址。
05:12
那紧接着呢,各位同学,你在这里做了一个这样的动作,就PTRVR这句话会导致什么事情发生呢?这句话会导致什么事情发生呢?干脆我把这个代码拿过来,这样来回来回切换就不费劲了。好,我把这个放这儿啊。嗨,这边。这边还得把这个格式弄一下,因为这直接粘贴拷贝过来呢,它这个有有乱码。不乱嘛,好,这样就就没问题了。我把他的一些乱码的东西给他清一下就可以了。好,呃,现在呢,差不多好,我整体往这边挪一下。不行,这个很讨厌,就有时有时候自己画一个图呢,还是。挺麻烦的,往那边挪一下。
06:01
好,我往这边移动。那移动过后呢,现在我们就可以把这一个。来,换一个颜色哈。换个颜色。好,也就是现在呢,当我们执行这句话的时候,比如说我这里用个箭头来描述。当我们执行这样一句话的时候呢,这个内存里面会发生什么变化呢?诶就相当于说现在咱们有了一个这样的东西。就说我这里有个PTR,对,那么这个PTR呢,嗯,他自己呢,会有一个空间,比如说我们画一个这样,拿一个这样的。拿这样一个图过来哈,这样子看起来好看一点。那么呃,他自己肯定是有一个地址的,这个咱们随意画一个好吧,0X1122,假设0X112。房子。好,然后我把这个,嗯,我把这个字体呢。颜色咱们改成白色的。
07:02
好,这样看着比较清晰,那这个时候它这里面有一个地址,呃,假如我我说假如我们这个。呃,数组VR的首地址是这样子的。好,我把这个。往这儿粘一下哈。广东移动上假设我们第一个元素的地址呢,是0X11,嗯三三吧,就就这样子好,那这个时候这里边就是同学们看到这个0X呢,这个0X11就是1133。那换言之就是我们这个变量,哎,就是我们这个变量呢,它也指向了这个空间,这个大家能理解吗。啊,这个应该没有问题,都指向了我们VR这个数组的第一个元素,也就是我们这个数组的首地址,那现在呢,大家可以看到。我们我们在去访问一个数组的时候,我们以前是通过这个VR的下标零。
08:01
一二是不是这样的方式来访问他这里面的三个元素对不对,以前是通过VR来访问的,但实际上呢,我们也可以通过这个指针来玩,那也就是大家可以看到在这里你们看啊,我在这儿用了这么一句话。VR。VR100分号D的地址,百分号P,这个P其实第一个地,第一个元素的地址其实就是现在这个PTR里面的值。啊,OK,那么这里面存储的这个十呢,我我我可以通过什么呢?我可以通过这个指针来取,怎么取呢?就是这个这个I,这个百分号D,当然是现在第一个元素表示的这个下标了,那星号P呢,就是这个星号P就是取值符,它通过这个地址呢,就能把这个十取出来,然后大家有没有发现我这做了这样一个动作,PTR加加,诶这个会发生一个什么事情呢?同学们,这是我们要学的一个关键点哈,这个讲清楚了,后面老师再讲,其他的就very easy,这个PTPTR加加,其实它是等价于这样一种写法。
09:08
等于PTR加一是不是我们以前讲过呀。那么那么这个PTPTR加加,它会发生一个什么事情呢?各位同学,他会这样子做,它会获取到我们现在指向的这个元素的下一个地址。说的再直接一点,就是在这个基础上加四个字节。就说这句话我说的再明白,就是在就会干什么呢,就是PTRPTR的这个它的这个地址,它存放的,存放的这个值啊。注意不是PTR本身这个地址不是这个玩意儿。不这个玩意,而是下面这它存的这个值会加四个字节。会杀四个字节。啊,会加四个字节,那为什么会加四个字节而不是其他的字节呢?原因是因为你你这个类型是int类型的,所以说这四个字节是因为它是特原因导致的,那么加四个字节我们我们以前在我们以前是不是讲过数组的地址本身是连续分布的,还记得吗?也就是说你你这个。
10:20
第二个元素的地址实际上是0X113,三加上一个四,也就是七。OK,那如果说这个再下一个地址,也就是同学们看到的第三个元素地址,实际上是在这个三七的集中再加一个四。那加加一个四不就是11了吗?那11应该是什么呢?应该是B。OK,那同学们看你PTR加加这个事情会导致什么事情发生呢?就是这个加一个四,说的再直接一点就是七了。那如果是七的话,我我如果变成七的话,这个I加加过后,我是不是又去。
11:02
这个I加加完了之后,现在我们访问的就是相当于第几个元素了呢?这个元素的地址,那么我我通过这个星号PTR。也可以把这个取出来,也就是现在如果这个地方换了的话呢,它的指向就。到这儿来了。然后呢,我再通过这个形式,通过这个指针可以去获取到它的地址,获取到我自己的地址,以及我指向的这个值,如果我再加加这PTR,因为你你个I还没退出去嘛,一共三次,再加加的话呢,这个就会变成在这个基础上再加一个四。说再直接一点呢,它就变成了B,变成B的话呢,诶它就指向了这个。所以说我们我们讲这个图呢,就把这个指针的运算讲的非常的清晰了,讲的非常的清晰了,能理解这个意思了吧,所以说这个加加其实呢,就是我们指针运算的算术运算符加的意思,但是大家一定要知道,这个加一不是加一个字节,而是加一个单位。
12:10
这点说清楚了没有,就这个地方千万不要认为是在这个地地址上加一个一不是的,而是加一个单位,我这已经很清楚了,把它标出来,它是它的存放值加。一个字节。你如果要一定要理解这个一,这个一代表的是一个什么呢?代表的是一个。哦,这样讲就应该更清晰了,我把这个往前面稍微挪一下好吧,因为这后面没地没没地方了,这个一呢,大家可以理解的是一个int。一个int的字节数。OK,这样子就理解的比较清晰和到位了,明白了吗?好各位同学,那现在呢,我就可以来玩一把了,好,我把这这段代码再重新复复复制到我们这边来,因为这边有注释嘛,对吧,这边有注释,我把这个删掉好吧。
13:02
好这样这样子大家可以看一下,那如果不出什么问题的话呢,他就按照这个方式来打了,他第一个打的是第一个元素的地址,然后呢,把第一个元素地址打拿出来,下面再按照这个方式把值取出来。好,我们来运行一下,好吧,我们来运行一下,看看效果是否是这样子的运行。好,我看看前面有没有没有注销的。我看一下前面有没有没有注销的哈,第八个。这些没有注销。我得。我得把这个注销一下。好,这个注销完毕,那同学们我们来运行运行一下好不好玩一把。我们看一下这个效果是不是跟我们想象的一样。OK,看一下吧。运用起来看结果,诶同学们可以看这个效果呢,跟我们想的一样,看d va0的地址是这个,呃,当然当然有同学说了,为有同学说老师为什么跟你这个图片上画的不一样,我肯定画不一样啊,你要这个地方还没听懂啊,说老师诶为什么这个地址是这个,而不是你这写的0X1133,你要问这个问题的话,我就没法讲课了,好吧,那就就完全听不懂你对不对。
14:13
好,那现在呢,大家看第一个元素的地址十,你看这个基础上大家有没发现哈,第二个地址,第二个地址你们有没有发现这个地方是在这个基础上加了一个四。加了一个是CC,其实是代表多少呀。A是不是12 B是11,那么C就是12,实际上是12加四刚好满了16,进了一位就变成了三零,看到没有,然后再把第二个元素打出来,然后在这个基础上三零基础上打,拿到我们第三个元素的地址,是不是在这个三零的基础中加了一个四个字节,那再把我们的这个什么呀,第三个元素值取出来了。没问题吧,同学们应该很简单好吗?我相信同学们都能听懂,没有任何难度,其实就是这样子的好吗?好,这个题我们就讲完了啊,这个题就讲完了,加加讲完了,那加加讲完后面老师就不用啰嗦了,减减是不是一样可以操作呀?
15:12
减减一样操作,我们再看一个减减减减的案例,减减的案例呢?我们在这个基础上给大家看一下,我就问同学们输出什么结果就可以了,好吧,因为我加加讲了,你要说减减,你还让我这样去画一次图就毫无意义了,只是说一下,如果这个是减减,我就说一点哈,假如这个是减减的话呢,它这个基础上,比如减减就是相当于减一个一,就减四个字解。你既然能加字节,当然可以减字节了,如果你减四个,是不是这个是B,减去一个四就变成什么了呢?B是12,那就变变成八了。变成八的话呢,诶变成七啊,因为刚才BB是B是十,B是11,十在这个集中减一个式,其实这个B是11,就变整个变成七,这个指针呢,它又。
16:05
还有指回来了,如果我们在这个基础上再减减它,又又减四个字节,减四个字节这个就变成了几呢?哎,变成了三,变成三,这个指针也就指向了,这能理解吗?啊,这个你要理解不了,我真没法讲课了啊,就不能说韩老师讲了个加加,听明白了,说一个减减你又不懂了,那这个课就没法讲了,那真的不适合编程,真的不适合编程,好了,那现在老师呢,就把这个案例给大家运行一下,我们来看看结果是什么就OK了好不好?同学们并不难哈,来各位,我们把这个先注销一把好吗?然后呢,我再来给大家建一个新的案例。好,我们预习一下,看结果,Print print printer。Pointer。ER,什么零?零二吧,P02。好,然后呢,我把这个CPP改一下。
17:03
好,各位同学,我们已然引入include,没问题啊,同学们,Include好,我直接翻过来就可以了。这就可以了,那我现在就直接问大家。说一下这个情况,大家看这里面是十。呃,一百两百一样的。大家看我这样子的啊,你看我这次给给的符号,上一次我们给的符号是VR对不对,现在呢,我这样给的值能明白什么意思吗?我直接VR max3,呃,Make max1,其实这个就应该是I的符号,VR什么样二。哎,这个2VAR2是不是就是我们第三个元素的地址,能理解吗?那相当于说这次我们是不是像刚才老师画的这个图一样。画的图像,它实实际上就一下就直接指向了。这块。相当于他这个地址原先是这样子的,明白了吧,那那这样子明明白了过后呢,你看我这就这样反着来处理的,大家看我怎么写的啊,这边呢,我反着来遍历IMAX。
18:13
Max,那这样我们可以可以轻松的实现一个逆序便利。这个I现在相当于是三,只要I大于零就减减,那相当于说我是一个反向变利。哎,相当于是什么呢,是一个反向的。来返向的便利,我先便利的是谁呢?我先把PTR存放的地址打出来了,然后呢,通过打出来过后呢,我又大家看我的第一个是干什么呀?我PTR先打印出来PTR存放的地址,然后呢,VAR。地址我又我又用什么方式呢?诶我又我又用这种方式把这个地址打出来了,就这个这个地方如果大家不愿意看也可以啊,这这个地方如果不看的话,就变成这个样子的。
19:00
这样大家看的更清晰一点啊,就这样子。诶,PTR群发的地址。对吧,这个其实是,呃,现在它存放地址,然后呢,我在用这个什么呢?在用这个星号P,哎,在用这个信号P,把它的这一个什么呢?把它的这个值打出来了。哎,打的时候呢,我是I减一,为什么要I减一呢?因为你这个max,你这个max刚进来的时候是三是不是三,那其实这个三第三个元素对应的下标是你这个三减一嘛。所以说这样子就应该等于二是这样子来的,明白了吧,然后这边就减减,这个减减的动作其实就是PTR等于PTR减一减一,那么本质这个一,这个一代表的是什么呢?一个一个int的一个int的字节数。好,直接说,当然了,我再说一遍啊,为什么是一个int,是因为你这是一个int,那我问大家假设,我说假如这是个short。
20:06
假设,假如这是个short啊,当然你这一改肯定下面都是错的,假如short,那么这个地方这个一呢,就代表是一个short的质集数,能理解了吧?哎,这个我已经讲了很多遍了,好吧,都已经讲的有点想吐了,好,大家一定要认真听啊,这是一个音的,那相当于相相当于说讲减四个字节。这四个字节。因为我这个计算是四个字节,好,那你减四个字节是不是就相当于说回到。这个地方就变成了几啊,变成了七。对不对,然后它就指向了这个位置。一次一次呢,第一次输的是200,第二次输的是100,第三次输的是十,好,我们来运行一下,看看了跟老师分析的是否一样就可以了,好吗?来我先把这个注销啊,注销了已经我们运行一下就可以了。这个地方应该是实现一个逆序打印,那应该是从后面,从后面这个地方呢,往前面打印的来运行之。
21:03
运行一下。运行起来,运行起来。看一下效果哈,诶这个忘了关了,不好意思。好,我们我们重新来一下。跑起来。跑起来。好的。保险过后呢,我们再来看一下,这次确实确实是逆向打运,你看第一个打出的是第三个元素。倒数第二个元素,这是第一个元素,你看那么地址呢,看是在逐渐减少,你看这个地地址,第三个元素是这个地址,它减去一个四过后呢,就变成了这个零,F0,在这个基础上再减一个四,再减一个四呢,就是ec,这个能理解吧,因为你减四这边进一位F就变成fe了,然后进一位这个是十,12嘛,就是C,好这样子的,好同学们,这个减减我们也讲完了,能理解吗?并不难,对不对。好,减减可以加加减减,我们的这个就说完了,那么再来看一个。
22:02
啊,这个我们先先截段视频吧,现在就是我们已经把加加和减减算术,就是指针算数的加加和减减给同学们讲了,对不对,好,我们截段视频。
我来说两句