00:01
我们来看几个关于指针的应用案例,首先呢,我们来看这边有一道题来让我们完成用指针来完成。第一,写一个程序,获取一个int变量的number地址,并显示终端,这个比较简单对不对?第二个将number的地址赋给一个指针。并通过这个指针去修改number的值,最后画出案例对应的内存布局图。那么我们先来完成第一个题,通过这个题呢,我们加深对指针的理解。好这个,呃,前面这个案例,我们先把它注销一下,我们新建。新建一个文件来完成。好的,我们写个名字叫做pointer。Pointer的一个练习。零一。好,我们来完成这道题。把它的后缀名咱们改成C。好,我们先引入include std。
01:06
对吧,然后呢,Void主方主函数。我把要求先给同学们写过来。这是我们提的要求。当我们拿到这个题过后呢,我们要进行一个简单的梳理,就是你拿到一个题要去做的话呢,第一次写的时候,你一定要按照这个流程来写好,首先我们按步骤来完成哈。格式化一下。他说,呃,获获取一个int变量的地址并显示终端。这个第一个题是特别简单的,我们来完成第一步,那int number。随便给一个值吧,比如说是100,或者说是88。然后他说要把这个int变量的地址获取到,是不是这个很简单啊,我们直接来打出就行了,比如这样子,我们获取一下,用一个变量来接收。BD1。
02:00
大家都知道,我们要获取到一个类型的地址呢,其实是用at number。这样就可以,然后我们输出。拿到。走起来,现在呢,我们可以这样会觉得说。呃,我们干脆一步步来吧,这一步先不写,这一步先不写,因为他现在还没说赋值嘛,我们先一步步来,那就number。的值。Number的值占于百分之d number的地址。地值等于多少百分之P,然后呢,值就用number输出地址是不是用I的符number。是不是就拿到了,然后为了我们能够看到这个结果呢,我们来一个get char,让控制台停停在这个位置,好,七哥就写完了,然后呢,同学们,我们来预习一把。运行的结果呢,我们可以看得到。第一个是输出88,第二个呢,把它地址输出来了,很简单,第一个就完成了第二道题。第二道题呢,是说将number的地址赋给一个指针,那你要想想。
03:03
既然你要把number的地址赋给一个指针。那你肯定先要获取的地址,而且一定要分析出来指针的类型是什么,这里面一定要有个分析过程。其实呢,隐藏一个分析,就是PTR的类型。类型是什么呢?就是这个硬的心了。那也就是说是为什么是特星,而不是。不是这不不是这个,比如说float型呢。为什么呀,是因为你这个number是int的,因此我们这边一定要有个对应关系,就是说你的指针。特星和float的星是不一样的,这取决于你的这个指针是指向怎样的一个变量。再说一遍,你的指针指向怎样的一个变量,那么前面这个类型要跟它对应。明白这个意思了吧,好OK,我说一下啊说一下注意注意指针的这个类型,它的指针是类型星。
04:11
类型型而和什么呢?是指针的类型吧,指针的类型和该指针,该指针指向的这个变量类型,类型是对应的,是对应关系。也你不能说我这个PTR是指向一个int的,但是我用float接收那是要报错的啊,同学们来,根据刚才分析,我们就可以写了in的形PTR等于爱的。Number。这样就OK,然后人家说了,并通过PTR去修改number的值,那这样怎么修改呢?是不是新PTR,我随便改一下,比如说给他。改成99。这句话,这句话就是代表通过PTR去修改numbers,呃,同学们要出现,为什么我我改,我通过这个地方。
05:06
不,呃,我我星号PTR是不是访问到number了,大家还记记得这个图吧。相当于说你你你对这个星号。星号PTR,其实这个东西就直接指向这里了。那你通过这个去修改,修改了过后,肯定对这个原先的变量也是有影响的,这个能理解吗。因为我是通过地址去修改的。OK,这点大家一定要注意,好吧,那现在我就继续往下面讲哈,那这个时候我们来测试一下,就是说通过PTR修改number的值过后呢,Number变量变量。Number变量的值也就相应的修改了,也就相应的修改被修改了。我们可以来看一看。同学们,我们为了看到这个效果呢,我们将其输出P点心走。
06:01
我们看一下啊,同学们,我说number的新的指标是什么。Number。的值。再次输出,注意看我们用number地址肯定没有变,地址肯定没变,只是改值,只是改了,改掉了它的值,我们可以再输出一遍。来看一下啊。这大家能理解哈,应该不难咯,应该不难。地址没有变化,也就是说上面上面这个地方这个值呢是88。Number是等于88的。而下面这个number呢,就变成99了,为什么?因为你你通过这句话去修改了number的值,我们运行一下,先把这个关闭。来同学们运行之看效果,注意看效果。我们运行起来过后,可以看到,可以看到。诶。我再看看为什么。哦,不好意思,因为我这句话大家有没有看到,我这句话是在之前打印的,是在把88给了过,立马就修改了,所以说这两个都会变成。
07:09
都会变成什么呢?都会变成这一个99。为什么?因为你这不已经改了吗?除非我这样好同学们。我这样。我这样,我把这句话提到上面去。这这个大家能理解吗?就是你看啊现在。现现在是这是一个88,我让这个PTR指向了number,然后呢,这个时候我输出这个number的时候呢,他还没有修改,因此它就是88。这个能理解吧,然后呢,我再通过这个指针去访问到number,并改成了99,那这个时候这个number呢,才会发生变化,如果我我按刚才那样处理,我把这句话拿到下面来。两个都会是99,为什么,因为你在这儿。
08:02
这句话已经把number修改了,然后你再输出number,那当然大家都是99了,能理解不?所以说刚才的问题是这样子的啊,我们把这句话提到上面去,就可以看到这个效果。那这样子就没有问题了。因为我先输出原始的字。先输出number,没有。没有修改,修改的这个情况好,这样应该肯定是88,现在这个变成99能理解,那同学们我们仍然运行一把,看效果。看效果。好的,我们运行起来这样子就没有问题了,你看上面是88,它的地址呢是这么多。经过你通过星号PTR改了number过后,这个number就变成99了,地址呢,仍然没有变化。好,这个题我们就说完了,能理解,紧接着呢,我们再来看,画出它的内存布局图,我们再画最后一次,以后我就不画了。
09:01
为什么呢?因为对于初学者来说,他对这个呢,还是有点听起来有点吃力的,我把这个拿过来再给大家画一次哈,再画最后一次。以后我就不画了。然后呢,我把呃。我我看看我偷一个懒。我把上面这个图拿来用一下,因为我在图形画太费劲了,我直接在这粘过来。载过来过后我在这改一改就行了。首先我们看。按照这个代码的执行流程,我们一步来走。首先。呃,最先前有个NUMBER88,那就相当于这是这这个是88。这个地址我不管它了啊,地址地址反正只要是相同就行,所以说这个地址呢,我就我就随就就就按这个写就行了,这个无所谓,因为这个地址每次都分配都不一样,所以说我就写一个地址,就它也可以,然后在这句话走了过后,是不是就把它连起来了。这个能理解吗?就是这句话相当于产生一个PTR,然后这个PTR呢,指向了这个number。
10:05
没问题吧,啊,这个地址肯定每次都不一样哈,每次都不一样,只是我这儿呢,就懒得改了。这个地址指向了他,然后呢,这句话关键是这句话,这句话你在输出的时候,大家看,就是同学们发现计算机在执行,这个时候呢,它显然直接访问的是number里面的这个88和number,这个地址显然就是88了,地址是什么就是什么。紧接着呢,它星号PTR99,这句话很关键,星号PTR99,它的本意是取出这个地址。对应的这个值。能理解吗?就是这句话是取出PTR的这存放的这个地址指向的这个变量的值。那相当于这句话会产生一个事,什么事情呢?当我们执行了新PTR等于九十九九后,相当于直接把这个88改成了99。
11:02
能理解好,这时呢,他又紧接着又去输出了number里面的值,显然这个时候显然是99了,地址仍然没有变化,原先地址是什么,现在还是什么。能理解不?不能,并不难,好,这就是我们的一个内存的一个分析图。是不是就很清晰了?好,这是我们的指针的应用案例,我们在加深一下,我们为了让同学们对指针理解的更明白一点呢,我们在布置了三个题,我们一起来看一眼同学们跟上老师的思路。首先我们来看这第一个,呃,他说他的要求是什么,判断程序是否正确,我们看第一个题对不对,大家觉得。这有一个int a等于300,然后我把我把这个A呢给到一个指针,可不可以。这个肯定不行,这个是错的。错误的原因是什么呀,同学们。错误的原因是他把一个int,它是类型不匹配,因为他把什么呢?他把一个int int赋给了int星,显然这是不正确的。
12:09
这个我就不去执行了,这个同学们自己愿意测试,自己测一下,肯定不是不是正确的,这个错的。类型不匹配,因为他把一个int给到一个int行,想类型都不一样吗?你不能说我把一个int给一个int指针,那哪那哪那哪行呢,肯定报错第二题。第二题,我们看它这是一个int a是个int类型的,然后呢,这倒是一个地址了,他把一个地址赋给了另外一个尺寸,但是很遗憾,类型不匹配。他怎么样呢?他把这个int新的这个地址给到float型,这个类型仍然是不匹配的错误。错误什么呢?原因是他把。他把一个这样的。一个值给了什么呢?
13:00
或者这样说啊,把特的一个地址。地址付给了,付给了一个float星。刚才老师是不是讲过一个道理啊,同学们还有没有记住,刚才老师在讲课的时候,我特别强调了一点,哪一点呢?是不是这一点我说了。就是注意指针的类型。和指向和和该指针指向的变量类型是对应关系。现在你对应吗?你你现在相当于想让一个这样的类型。指向一个什么呀,你相当于想象这样一个的新这样一个指针类型,指向一个int显然不行。没有没有关系,那有些有些人说你给我试一下,我可以给你马上试一下。我把这句话呢给同学们放到这,我们编一下就可以了。我我不一定,你看这个放在这直接就错了已经。看到这是不是已经提示这个信息了,说他说什么呀,Error int星类型不能用于初始化float新类型的实体。
14:05
是不是一个道理?好,刚才也是一样的喽。好,这是错的啊。最后我们再来看一下这道题,输出是什么东西,我们来一起分析,根据强调讲前面两句话,这个很好理解。A,现在这个A就等于了300。下面这个地方B是不是等于400没问题吧,跟着我老师思路,现在他把A的地址,其实相当于把一个int类型的地址付给了,付给了PTR,这个肯定是OK的,因为他们类型是匹配的,这个是肯定正确的,然后呢,他通过这通过这个PTR这个指针去重新附了一个值,那我问大家此时此刻A和B有变化没有?A和B肯定A变化了,因为你现在这个PTR相当于说这个PTR是指向了哪里呢?你可以简单指向A了,我简简单的说啊,没有说,应该是这样说,PTR存放的地址指向了A变量。
15:08
但是我这样说太啰嗦了,我就简写PTR直向A,那你星号PTR等于100,是不是把A就改了,A就变成多少,变成100了,跟上我的思路,紧接着呢?他又把。这个B的地址给到PTR,这个可不可以?这个也是OK的啊,没有问题,因为我只是让PTR指向另外一个。整形的地址吗?这个没有问题,这是可以的,也就是说大家要知道现在PTR指向什么呢?指向B了。能理解我的意思不。紧接着他又通过这个星号PTR去制了一个200,我问大家谁会被改变?B是不是就被改了,B改成多少了?改成200能理解我的意思不?那现在呢,这时它就输出这个值了,我们看输出内容应该是什么呀?输出内容应该是A等于100。
16:01
没有问题吧,B等于200没问题吧,然后他又说持这个新PTR等于多少呢?那显然是最后这个,因为你上面不是已经不一样了吗?所以说最后这个新PTR呢,注意听新PTR应该等于200。后面他取的也是这样的值,那有些同学说老师我们运行一下呗,可以我给大家运行一下,看看这个效果就行了,好不好,给他运行一下并并不难,这样子为了。嗯,为了跟上面这个不冲突呢,我先注销一把好不好,我们就看这看一下这个结果就行了。格式化一下。我们看看这个结果跟老师分析的是否一样,我们刚才分析的结果是不是这样子的呀。是不是这样子的,A等于100 B等于200,星号P等于200,我们看这个结果跟我分析的一样就OK了,如果分析跟实际输出不一样,那说明我们就错了,如果一样,说明我们分析是正确的。来,同学们先看编译有没有问题。
17:04
生成一下生成起来,生成了过后呢,我们发现诶这对这个没没有关闭。再重新来生成,生成过后呢,我们发现代码并没有报错,是不是成功啊,现在呢,我们运行看结果,同学们看结果。看看这个结果跟我们分析的是否一致呢?是否一致呢?我们捋一捋。A等于100 a等于100 B等于200 B等于200,星号PTR等于200,星号PTR等于200 OK的OK,所以说我们这个分析是完全正确的。完全对,这样子我们通过了应一个应用案例,还有三个课堂练习题呢,相信同学们对指针有了进一步的认识,各位,那关于指针的练习,我们就先给大家说到这里。
我来说两句