00:01
指针入门我们先来看一下指针的入门介绍。这里我先特别的给大家说明一下,指针这个概念相对比较复杂,我们本身是要放在后面讲解的,但是呢,因为授课就是我们在后面讲函数,或者是在讲传地址传值的时候呢,就会使用到指针这个概念了。因此呢,我们把这个指针。做成两个阶段的讲解,我们先就是现在呢相对指针做一个入门的讲解,后边呢,我们还要详细的介绍这个指针,也就是说现在老师先对指针做一个入门级的初级的一个讲解,后面还会讲讲。原因就是因为很快就会用到指针,如果我不跟大家讲,不跟大家说一下指针是个什么东西,让大家有个初步的认识,后面这个课你听起来比较吃力,所以说我们把只能分成两个阶段来讲,明白我的意思了吧。
01:01
那么我们来看一下指针到底是什么呢?简单的说,简单的说,指针表示的就是一个地址。我们举几个例子来说明一下。大家看。大家看这样一段代码,这呢有一个int number等于一,现在问你NUMBER1的地址是什么?大家还记不记得我们在前面讲过,如果我们代码写一个int number等于一,那么相当于在我们的内存里边,假如这是一块内存。这个内存里边呢,OK,就有一个变量,这个变量指向了一个空间。指向的一个空间,这个空间里面呢,放了一个数值,就是一,还记得吧。那问题就是说,你这个空间我们不是原先讲过吗?这个空间相当于是一个房间,那么这个房间呢,在我们的内存里边,它是有一个地址的。在我们现实生活中房间大家注意听,在我们现实生活中,房间呢,是用这个这个房间的一个号,它的一个号码来表示的,那么在我们的计算机里面,时间里面干什么呢?就是我们这个空间啊,房间就相当于是个空间,对不对,在这个空间里面呢,它是用这个地址来区别的,明白这个意思了吧。
02:21
就有点类似于我们这个地址,有点类似于这个房间的号码,那有些同学说说了说老师,那么我们怎么去获取到一个。一个这个int的,或者是一个数值的一个地址呢,我给大家演示一下,那同学们现在呢,我们把这个代码打开哈。哦,这这是我们以前的代码,不用去管它,我们新建一个文件。这个呢,现在我们讲的是同学们,我们现在现现在讲的是一个指针的概念,因此我对它取个名字叫pointer。Pointer就指针的意思。添加。
03:02
好,加进去吧。那加到这里面去。呃,怎么他他这个名字好像跟他刚好有冲突哈。我我先把这个关掉。啊,这个我们。因为这个名字可能是刚好是冲突的,OK,把它删掉。我重新取个名字。重新取个名字叫my pointer叫区分一下。这样子啊,刚才那个没有选中,选中窗体了,应该选中CPP再重新来想。下一步。好,那个pointer过后呢,我们把它的后缀,把这个pointer的后缀呢,也改成C。现在就是我说一下这个地方是干什么的,就是讲解,讲解这个指针的一个入门,首先呢,我们仍然include,是不是这前面讲过include include,我们的std。还记得吧,就是输出,然后呢,我写一个VO。
04:04
贸易的主方主函数。好,那这个主函数写好以后呢,我们来完成这个问题,比如说我有个number等于number number等于一没问题吧,现在大家都知道我们现在要完成一个任务,就是刚才在这里说的这个NUMBER1。他的这个地址是多少。它的值是多少?是不是前面已经讲过了,比如number number1对应的值。的值是不是这样输出的呀,那么NUMBER1NUMBER的这个地址,就它对应的这个地址是多少呢?现在我们把地址给他打出来看一下,地址呢,用百分号P来指向,这个P代表point的意思,大家记住说明一下啊,就是我再说一下,如果如果要输出一个变量的地址,一个变量的地址使用的格式是什么呢?百分号P记住了。
05:07
那我怎么打呢?值当然就是number了,它的地址呢,前面加个艾特服务,很形象的number。注意我这。对他作了说明一。那么说明二,大家有没有发现我在这里用了一个东西,说明二,大家有没有发现我这写了一个。艾服,NUMBER1这个表示什么呢?表示取出NUMBER1这个变量的这个变量变量对应的地址,那么我们现在来输出一把get char。好,同学们,我们运行看看这个效果到底怎么样哈,我们运行之。跑起来。抛起来过后呢,我们可以看到它会打出这么,诶这是什么错误,看一下。哦,我知道了,因为上一次呢,咱们有一个主方法啊,主函数没把它注销掉,我们把注销一把就可以运行了,来回到刚才的pointer,我们继续来运行。
06:09
那么运行过后呢,我们可以看到,诶,为什么还有最后呢。看下还有哪个地方有问题。这不是已经有过了吗?我已经注销了呀,这个。注销了,难道还有别的地方还哦,这边还有呢。我们把这个也注销哈,因为又还有主主方主函数,咱们在一个项目里面只能有一个主函数,对不对,以前讲过再运行一下来看一下。好,同学们,现在看看还有什么问题没有,起来了,同学们看这里,看这里是不是它提示number的值为一,它的地址是这个,那如果这样子的话呢,我们就可以画出它的对应的内存图了,我们来看看对应的内存图是什么。因为我们有时候讲的时候呢,我们能够为了让大家听明白呢,有时候我要画出它的内存一个对应情况来,在这里。
07:04
我们把刚才的这段代码拿过来。刚才这这一段代码是不是这样子的,同学们是这样一段代码是吧,这样一段代码,我把这个放大一点。把这个代码这样子,结果呢,还不行,呃,那就这样子,这样解起来看起来比较吃力,我。我这样子。为了简单一点呢,我截一个图好吧,这样大家理解起来就比较清晰了,我把这个图呢,放在我们的这个Excel文件。那怎么来看这个内容呢?可以这样去理解,可以这样理解,假如这是我们的一块内存。这这是我们的计算机吧,计算机,那计算机里面呢,大家知道是有一块内存的,我们把这个内存标出来。黑色的吧,黑色的,那当我们这有个NUMBER1,就是我们的代码从这里开始执行的时候,看到没有,从这里执行,从这里执行我们会得到一个变量叫number,那么这里面有个一,那计算机我们在前面讲过,只要产生一个变量,就会有一个空间,我们可以这样写,比如说这有个number。
08:12
这个number。那么诶这个颜色哈。标成白色的。Number,这个number指向了一个空间,是不是我们前面讲过,我在插入一个小房间进去。放这儿吧,我们换一个颜色哈,换一个颜色说清楚一下,那么这个小房间里面放的是什么呢?反正就是一。这个黑色的你可以理解成代表就是一个内存。能理解我的意思吧,那么这个NUMBER1呢,同学们根据刚才的讲解,这个NUMBER1它就指向我们这个。空间是不是,诶,那它指向这个空间的问题,问题来了,就是我们本身这个空间也是有一个门牌号的,这个门牌号在我们编程领域就称之为地址,那这个地址是多少呢?还很具体的,就它。
09:02
我把这个给大家全选一下。选错了啊,全选。所选我把这个例子给他粘过来,就他。他的弟子长的样子就这样子。方。就这个。OK,就这个例子啊,这个颜色咱们用的不好,呃,因为我每次都得换颜色,比较麻烦,就这样子,也就是说大家在脑海里面应该想象到,就是当我们去。在这里定义一个变量过后,当然它可能是int,也可能是float,也是double,这个无所谓啊,啊,不一定只有int了,就float。还有这个short,呃,还有这个char,都是一样的,那么这里面就会有个地址。这个例子就来标识我们这个门牌号。门牌号,那这边这个值呢,就是我们这个空间里面放的具体值number number,就说这个number就指向这个空间。
10:01
对,就这样一个含义,也就是说实际上在计算机的底层,在计算机的底层,它怎么通过这个变量的名称来找到这个对应的值呢?听我说就是在计算机的底层,当我们这写个number,他怎么知道这个number。对应,它怎么知道这个number里面存的是一呢?其其实它的本质是这样子的,他先通过这个变量。他先通过这个变量找到,找到这个变量对应的这个地址。再从这个地址找到这个空间,然后把这个取出来。就有点类似于,就有点类似于我们在现实生活中,别人让你去找一个门牌,找一个房间,是不是先给你一个房间号码呀,他给你房间号码,然后你通过这个房间号码去找到他的,就这样去理解好吧,OK,这个呢,就是我们的一个地址的概念,就是关于地概念,那接着往下看,指针又在哪里出现呢?大家看我说啊,大家看这里面我们来引出指针的概念,比如说这有一个int I等于99。
11:08
等于等于999,如果我把这个in特I的地址付给这个,那我干脆这样子啊呃。呃,因为前面已经有NUMBER1了,已经有个number了,我也可以这样来讲,因为这个案例呢,是用的I,干脆我们就用number一样的,你看我这样来写。我可以干什么呢?我可以干什么呢?注意听指针引出来了。指针要这么去理解。所以现在我定义一个指针。我在上面定义。我定义一个指针变量。这个指面指针,指针指向哪里呢?就指向指针的概念就这样来了,来,我给他写一个比方说我在这里写个int。星号PTR等于。地址number,大家看这句话怎么理解啊,大看这句话怎么理解这句话呢?我对它做一个小小说明,第一点,第一点同学们看这里。
12:10
Int新这个就表示类型为类型,为什么呢?为这个指针类型。指针类型。它是具说的,再具体是一个什么,什么样的指针类型呢?是指向指向一个int类型的,一指向一个int类型的指针。好,这样就理解了,就相当于说我将来这有一个变量。就是说我这个PTR是一个什么类型呢?是一个指针类型,这个指针类型它指向什么呢?指向一个int类型。就说他相当于说这样这样理解啊。这样理解我,我说慢一点。Int星表示类型为指针类型,那么它的名称是什么呢?名称是PTR。
13:00
PTR就是我有一个数据类型为int新的一个变量,叫它,也就是说PTR就是一个什么呢?PTR就是一个int新的类型。这个大家能理解了吧。啊,那么这个类型它是干什么呢?就是PTR,它指向了指向了一个什么呢?Int类型的。变量的地址。好,这样就很好理解了。就是说PTR呢,PTR它指向了,指它这个PTR它是指向了一个int类型的变量。PDR只用一个类int类型的变量,这个地址要不要也无所谓哈,就说可以这样理解,那我一个图吧,我画一个图大家一下就明白了,因为用文字描述其实特别不容易,我用这个图来描述,你可以这样理解,当我们增加完这样一句话过后。增加完这样一句话,在我们计算机底层会出现一个什么情况呢?大家来看我的说明,相当于说我在这里。
14:06
我在这里,我把这个复制一下。相当于说我在这里呢,有了一个变量叫PTR,注意听PTR。这个这个PTR呢,它也有一个空间,注意听哈。它有空间,这个空间里面放的一个地,放的一个值是什么呢?就是它的这个值,就它的一个地址。这个大家理解了吧。也也就是说这个PTR。就是你们看到这个PTR是指针,它呢指向了一个空间。它只要一个空间,这个空间里面放的不是一个,放的不是像我们的int呀,或者float地址,它放的是一个什么呢?放的是个地址。对,放的是个地址,那有些同学说了,说老师,那我们这个指针会不会也有地址呢?也有地址,也就是说指针这一块它也有自己的地址。
15:02
就他也有自己的一个地址。他有自己的地址,那有说老师,那你能把这个PTR地址我们拿出来看一下吗?没问题,我也可以给你们打出来看一下。好,我们在这多说一句话啊,就是指针,指针变量,指针变量本身本身也有地址。也有地址,这个大家能理解哈,我给大家打出来看一下,你们就一下秒秒不了PTR。的地址是。地址是就是PTR的地址是什么呢?我们用这个输出先给大家看一眼。我换一行,这个地方稍微有一点绕,但是还可以,因为我画了图了,对大家理解起来应该还算OK,那如果我要打出这个。PTR这个指针变量的地址的话呢,我仍然用这个来取PTR。OK了。对不对,好,我呢给大家运行一下,大家注意观察哈,注意观察,我先把这个关闭。
16:04
这个稍微有一点点绕,大家认真听我慢慢讲哈。这块呢,稍微有一点难度,同学们看到PTR也有地址,也就是说啊,也就是说它本身的地址是这个。换言之,如果我们在内存里面画的话呢,这个小问号就它。既然不一样,那大家有没有发现?大家有没有发现,他们之间的关联关系就有了。也就是说,也就是说我们这个指针它是这样一个流程。它呢,本身是一个变量,是变量就会有自己的地址,或者有自己的空间。它有一个空间,是这样一个空间。这个空间的地址是0038F7e8,呃一八,这个是16进制的,这个你先看不懂没有关系,你就认为它是一个。一个一一,一个数字表示它的一个门牌号,或者是表示地址都可以,然后这里面存的内容是什么呢?存的是零,04FFBB,零,它就指向了这个。
17:09
Number。这个地址就是它是通过它的存放的一个地址指向了另外一个。对应的变量。啊,这个变量的一个空间,就这样子理解就行了。那有些同学说了,说老师,那你能不能把PTR里面存放的这个东西给我们打出来看一下呢?也可以我们继续接着讲,接着讲,那么再说啊,PTR。PTR。它存放的,它本身存放的这个值,值是一个地址,那这个地址是多少呢?我也给同学们打出来看一下,非常的简单哈,来百分P,如果你要取出,你要取出这个PTR本身存放的东西呢,就不要取地址了,就PTR就可以了。注意听这句话啊,就是这句话呢,就PTR存放的值是一个地值是为什么呢?为这么多。
18:04
那如果说如果说我这不出不出问题的话,大家应该想的到这个地方。就是同学们看到的这句话,这个地址等于多少呢?这个地址打出来过后呢,就应该是上面这个地址,我给大家看一下是不是这样子的,来同学们运行值。确认一下这个环节。大家看到在这里我们发现的确是这样,你看。就是。PTR。PTR的地址是这么多。那么就是NUMBER1的地址是0035FB0。呃,这个PTR本身的地址是0035这么多,然后PTR存放的值是个地址是多少呢?是它,你们有没有发现这个值和这个值是一样的。大家有没有发现这两个字实际上是一样的,这就是我刚才说的这个道理,当然有同学可能说了,诶老师不对啊,你刚才在画图的时候,在画图的时候明明是004EFBB0呢,为什么现在又变成了0035FB?
19:13
一零呢,我跟大家讲,因为你每次运行的时候,就是你每次运行我们这个程序啊,你每次运行我们这个程序的时候,这个系统呢,它每次都要重新分配,你想嘛,你把这个关闭了,你关闭了,你关闭过后,它一运行这个系统肯定是重新分配地址呀。他不可能每次都用那个地址,对不对。这个大家能理解不?这点大家一定要理解,你不能说说韩老师在第一次运行的地址是这样子的,那他以后永远都是这个地址,不是这样子的,他只要保证什么呢?他只要保证他们这个之间的指向是一样的就可以了,说清楚了没有?理解了哈,这个大家一定要注意,那么我们再运行一下,可能又变化了,但也可能又不变,看这次又变了,但是不管它怎么变,你们有没有发现这个地方总是和这个地方相同的。
20:06
也就是说刚才画的那个图的那个连线是相同的,好,我们再来完成下一个问题,那么有同学说了,那这个指针指针它能够指向。一个变量的地址,那么能不能这样子呢?就是我能不能通过这个里,就是我能不能通过这个指针。去取到它指向的这个空间里面存放的这个值呢,也是可以的,同学们也是可以的,来,我再给他写,这点比较重要,大家稍微忍耐一下,这地方很重要的,因为学指针就这么一点点东西,那么我说一下PTR。它指向的。它指向的这个这个嗯,应该说PTR。的PTR指向的这个这个值。指向的这个值啊,我就直接说这个值等于多少呢,我现在这样输出了。
21:04
那怎么样取出PTR指向这个值呢?也就是说我想取出这个PTR指向的这个一,就是这个值这个一把它取出来怎么指呢,没有问题,这样子的啊,注意听星号PTR这个也是我们。这个C语言的设计者规定好的一种写法,我把这个写上。地址哈,这个地址是PTR,这取法。第二种,第二,刚才我们说明的第一页指针变量本身的指针。指针变量。存放的他自己存放的值,存放的存放的这个地址怎么取呢?就直接PTR,还有第三点就是获取,获取,注意听获取指针指向的指向的这个值,那么就应该用星号PTR就可以了,那大家想一想,你动动脑筋哈,如果老师不去运行,你能不能分析出来这句话应该输出什么?
22:05
是不是应该输出PTR指向的值等于一呀?为什么是一啊?你这是一吗?那个图很重要,好的,同学们,我们预习吧,看看老师说的是否正确,认真听,认真听,这点特别的重要,各位朋友。好,我们可以看到的确是这样的,大家看。是不是这样的,同学们是不是这样子,因此这样我们就讲完了,就是一个关于指针最基本的内容就说完,也就是说同学们一定要老老实实的把这张图记住。你只要把这个图记住了,再把我们这儿讲的这个小案例这几点记住就没有问题。指针的最核心的地方就这么一点,万变不离其宗,什么二级指针、三级指针、多级指针都是在这个基础上变化而来的。OK,同学们,那我把这个。呃,这个代码呢。整理一下。这,这里面的注释很重要啊,同学们很重要。
23:01
把这个整理一下。先拉一下啊,我同样我把这个图更新到我们的Excel表。好,然后呢,我把这个图就换了。换成我们,嗯,这个最新的这张图,这样呢才有一个对应关系,对不对。这样才会有一个对应关系。就是就是这张,就是我们的这张图。我把这个关联关系给他捋一捋。放一个。图形就是我们的这边的代码。这边的代码对应的这个图就这样子的,但是注意啊,你如果去运行的时候呢,就嗯,这个地址不一定永远都是零,零是EFBB0可能是在变化,但是不管怎么变,这这个地方的值一定要跟,就是这里面这个指针,这个变量里面存放它的存放的这个值一定要跟这个NUMBER1它的地址。
24:03
这两个值是相等的,也就这个值和这个值一定要相等。但是可能每次运行它不太一样,好同学们,那关于我们指针的一个快速入门老师就讲到这里,大家明白了吗?其实也不是很难,对不对,就是通过一个小案例来认识它,应该不是很难,主要是把这个图理解到位就OK,这是我们指针里面最核心的啊,最核心的内容大家一定要认真的体会好。同学们关于指针的第一第一个小部分就给大家讲解到这里。
我来说两句