00:02
关于函数注意事项和细节讨论,我们来聊一下。我们前面呢,讲了函数的这个调用机制,也讲了函数的递归调用,对不对。那么我们看看在使用函数的时候,还有哪些地方需要同学们注意。第一个函数的行参列表可以是多个的,这个我们是不是已经用过了,就是我们形成列表可以是一个,可以一个都没有,也可以是多个。第二点呢,在C语言中,传递参数可以是值传递,也可以是传递指针,也叫引用传递。那么前面我们看到这几个题,各位同学,那这样子啊,你比如说你比如说这个。这个。这个就是我们的直传地。因为我们在传这个N的时候呢,这个N它会在我们的这个站里边,比如说这个,比如说这个是吧,比如说这个函数test,我们传了一个六进去。那么这个时候这个N呢,它会在这个站里面产生一个新的变量叫N,这个N变量呢,跟我们的这个number的。
01:08
这两个是不一样的,就是说你也你也你也是六,我也是六,但是呢,我是把你的这个值拷贝到这个N里面去的,所以说在目在这种基本数据类型的时候呢,我们其实都是直传递。那么,至于什么是传递指针,待会儿我举例说明。第三个我们来说一下函数的命名规范,那么函数的命名规范呢?首字母不可以是数字,它可以采用驼峰法或者是下划线法,比如说我们要得到一个最大值,可以写get max,这个就是驼峰法。也可以写get_max这个就是下划线法,两个人都可以,一般来讲哈,我们推荐使用驼峰法,但是你用下划线法呢,也不是错的,最后一个再说一下第四,一个函数中的变量是局部的,函数外不生效,这点什么意思呢?来我写几个小案例。
02:04
那我们把这个注销一下,各位朋友,那这里面我们写一个案例,专门讲我们函数的细节好不好,这些个function detail。Detail,跟上老师思路,Function detail,我把这个呢换成C。比如说我现在。有这么一个用例。这是个VO的主函数。这里我们说的是什么意思呢?说的是函数中的变量是局部的,函数外不生效,这一点我要给大家聊一聊。比方说我在这里写了一个函数,假如说哈写了一个F1。写的F1。那么假如我在这里面定义了一个变量,OK,比如说我定义了一个变量叫number等于十,假如说我这写了一个,那么我告诉大家这个NUMBER10呢,你在main函数使用使用不到的,比如说你说诶老师我用一下这个number。
03:02
我输出一下这个number值可不可以呢?你们觉得诶看我在这里写个number,显然它会提示我number这个未定义。为什么呢?因为你在你在这个函数里边,F1这个函数里边定义的这个number呢,那只能在F1里面使用,而不能在F1外面使用,除非你把这句话拿到里面去说,老师我在这里面打印一个可不可以,这是可以的。这这里面就不会报错,因为这个number呢,人家是能够检测出来,编译说哦,这个number在哪里呢?就在这个函数内可以的,但是呢,你不可以在函数外去使用。就是说在函数外不能生效第五个基本数据类型,默认是只算定,是不是前面我们讲过呀。及进行值拷贝,在函数内呢,修改不会影响影响到原来值,关于基本数据类型是值传递,还有哪些是引用传递,是不是我们在前面是专门讲过的,回回一下。
04:03
往这边拉,我们应该是在讲哪块专门讲过这个地方啊,是在讲变量的时候,我记得专门讲过这个话题在这里。是不是在这里我们讲过默认传递,默认传递值的类型有这么写?那么默认传递地址的有指针和数组,是不是还有印象不?没有印象自己来看一下好不好?那现在呢,我们还回到这边继续来讲解,就是什么意思呢?就是说基本数据类型默认是值传递,即进行值拷贝,在函数内修改,不会影响到函数外面的值。就是说什么意思呢?就是说你在这里面打个比方哈,各位同学。我举个例子。啊,我们再举一个新的例子。啊,这这样子不能使用,我这写到这。我们再举一个新的案例。比方说我又写了一个Y的F2,好不好Y f2,那么在这里呢,我有一个变量,比如说是int n,然后呢,我把这个N呢,做了一个加加的处理。
05:09
加加的处理,然后呢,我怎么做呢?我在这个主方法里面,我也定义这个N等于九。然后呢,我调用F2把这个N传进去各位,然后呢,我问大家一个问题,我问大家一个问题,此时此刻我在这输出这个N。等于多少,也就是说我写一下这个main main函数中的N。等于多少?是九呢?还是加加过后的值?这个地方可以负责任告诉大家,是等于九。为什么等于九呢?原因就是刚才老师说的这句话。什么意思啊,就是。就是这句话。我写到这来。什么呢?基本数据类型的传递,默认是值传递及进行值拷贝,在函数内修改不会影响到原来值,也就是说,呃,也就是说大家可以想象到,就相当于说在我们进行这个传递的时候,这个F2这个站里面呢,它会产生一个新的N,这个N它传进来的时候是九。
06:10
然后N加加过后呢,这个N就等于十了,但是但是这个。这个main函数里面的这个N呢,跟它并不打架,原先是九对不对,你你你调用这个F2的时候呢,它把这个值传到这里面去了,在这里面会产生一个新的N。这个N的变化不会影响到main,这个函数里面的N理解了吗?因为它是值传递,再说一遍,是值传递,是拷贝了一份过去。对不对,好,这点大家注意一下。好,这个地方我就说的是这个细节,紧接着我们再来看下一个说,如果希望函数内的变量啊,函数内的变量能够修改到函数外的变量可以传递地址,即我们所说的传递指针,那这个就是说函数内以指针的方式来操作变量,从效果上来看类似于引用及传递指针,我第六题给大家讲一下,比如说我们现在呢。
07:09
有这么一个需求。我有一个贸易的F3,我我把这个粘贴过来。粘贴过来好,呃,我们这样测啊,诶F2F3。我们先我们先来运行一下这个是不是九,先验证一下是不是九号运行。把这个先注销啊,这个已经注销过了。来跟着老师思路,现在我们先看看main函数里面的这个N是不是九。如果不出问题的话,肯定是九了,诶闪一下,不好意思,Get串。那么顺带啊,顺带我们把这个这个也打印出来,因为它调用F2,那么我们说F2中的这个N等于多少,我们看一下。各位同学,能你能想到它等于多少吗?这个N肯定是等于十的,因为你传进来的时候,这个N是九加加变十了吗?为了好看,我们换行。
08:03
这边是不是也换一行啊。也就是说你传一个传一个九给到他过后呢,它在这边这边改变是在F2这个站里面改变,而或者叫F2这个函数里面改变,并不会影响到命,命这个N呢,还是九运行一下。跑起来。跑起来,我们看效果。我们跑起来可以看到F2N等于是幂19,但是有这样一个需求哦,假如说你就是希望。哎,同学们说老师那我不管,我就是有这么一个比较奇怪的需求,我就想干什么呢?诶,我就想函数内的变量能够影响到函数外的变量,我怎么处理呢。咱一样可以做,举个例子。举个例子,比方说现在我们要传递的时候,就这样写了。各位。A。这样我们写一个P啊,那也写个N也可以啊,写个P相当于是指针,然后呢,我这样写。
09:03
星号,P。然后这一天我把这个纸拿到,然后再加加。大家知道这是什么意思吗?诶,待会我们来分析一下这个会怎么做啊,那这个时候我们再来玩一把,比如说我把这个注销了。我把这个注销,现在我改成用F3传递。那F3传D的时候呢,我们这个时候传一个N进去,你会发现这地方会报错。为什么会报错呢?他说AF3是,你看F3这个地方,它要接收的是一个指针。那也就这个时候呢,我们要用传指针的方式来玩,我们不是讲过吗?我们不是讲过吗?这个函数参数传递有指传递,还有针传递,指针传递其实就是引用传递,也叫递子传递,这个时候你该这么传怎么传来前面打一个艾。这就可以了。那么a f3怎么还是不行,诶,这不好意思啊,这给你改成这个。这就对了。这样就对了吧,这个这样传递呢,我告诉大家负责人,告诉大家这个里面的改变哈,这个就说这里面的加加。
10:08
这个地方修改会影响到。会对函数Y的函数Y。的变量影响。有影响。那也就是说,也就是说这个时候你这是个九,你把这个N的地址传进过后呢,这边的这个加加会直接对这个。Main函数里面的N进行修改,换言之,这个时候就应该输出的是十了。是不是这样子的呢?来朋友们预习一下。是不是这样子呢?确实是这样的,大家看一下。是不是啊?这个很重要,同学们,那有些同学就问了,说老师怎么回事,为什么这样子传递,它就会影响到这个,影响到外面这这个命命函数里面这个N呢?来同学们,我们画一个示意图。还是老规矩好不好,还是老规矩,这次呢,我们画一次,呃,这段代码我拿过来。
11:03
这是我们的移动代码。给他说一下这个原理就可以了。这是我们的命。OK,这这边我就不管它了啊,去掉。呃,然后呢,这边还有一个是不是有一个F3这个,呃,F3这个方法呀,我们也把它拉过来好不好。拿过来。拿拿过来过后呢,我就直接给你们写写这个原理就可以了,来我们还是按照代码的执行流程来进行一个分析,首先呢,从这里开始走。那同样道理,我们是不是也有一个计算机的内存呢?把这个计算机内存拿过来还是有占来跟上老师思路。对,假设,假设呢,这是我们的一块占空间。怎么来玩呢?首先根据我们前面分析一道,主函数会有一个幂函数的站好,这个呢叫幂函数站。
12:03
OK。那这里面是不是会生成一个N等于九啊,那可以这样写N。走。是不是它指向了一个空间?这个空间里面存的是一个九。没问题吧,那我问大家一个问题,既然它是一个变量,它会不会有地址?肯定有地址啦。好,假如说我就我我就随意画一个好不好,假如说它的地址是0X1122,假设啊。但是我我没有去打印,打印其实也可以打印出来,我们现在是不是学过打印一个变量的地址是学过的吧。好,那么假设它地址是这样子的,接着往下走,下一句F3,那么这个时候呢,它执行了一个动作叫F3,注意这个时候它传的是什么呢?爱的N是N,这个时候大家知道爱的符号是取地址符号,是不是讲过讲过吧,这个爱的符爱的N是取得到是是传递,传递哪一个呢?N变量的地址。
13:03
说的再具体一点,就是这个0X0X1122。112,那这样子的话呢,这个地方不是一个函数调用吗?它会产生一个新的站。注意听,这样很关键的地方来了,它会产生心脏,好,这个站呢,我们姑且叫做F3站。或者F3函数,那在这里同学们看F3这个函数呢,它传递到这边来,这是不是有个PP是一个什么,P是不是一个地址啊,它肯定也有自己的空间。他肯定会有自己的空间。但是这个空间里面存的是什么呢?存的是你传递过来的地址,换言之就是这个P,这个指针呢,它传的是它里面存的是这个玩意儿。大家现在明白什么意思吧?当然有同学说他本身有没有地址,他现在也有地址,是我们在第一天就讲过的,他也有地址,比如说他是3344假设啊。我就假设的这样写的。
14:02
好,那么同学们可以看到,那这个P的这个地址呢,它就通过指向这个地址了。好,这样这样子这个关系就形成了,紧接着呢,它在这里函数里面做了一个动作,是这样写的,星号P。然后加加。我先问同学们一个问题。就是星号P这句话是干什么?是不是讲过星号P是指取,是取得或者指向它的这一个地址,指向的这个变量,我再说一下,其实这个叫做取值符。这个是不是讲过是取值或者叫取值符。取值符,它取的什么呢?就是得到P这个指针指向的指向的变量。说的再具体一点,就是取到这个酒了。也就是说你可以理解这个星号P啊,你可以这样理解,就说这个星号P呢,就直接指向我们的。
15:02
这个酒。完全可以这样理解哈,就相当于说信号B知道它那型号B加加。那十分就是对它进行加加呀,那变成十了吗。能理解了吧?如果它是一个信号,B是取值符,它得到P指向指针指向的变量,就它,然后加加不就后面这个加加不就把九变成变成十了吗?好这个时候他这就执行完毕了。执行完毕就回到这边来了,回到我们这句话,当然执行完毕过后,你可以可以认为这个站销毁了,但是虽然销毁了,可是他留下的这个痕迹是没有办法的,因为这个九已经在他,嗯,执行的过程已经变成十了。就你看啊,假设这个就就算销毁了,销毁了过后是不是他在这个主站里面。在这个主站里面,他执行了这句话啊,这个我还恢复回去好吧,因为待会呢,我可能会这个,这个我便于大家复习嘛,他回来好呃他嗯,他这执行完了过后他就返回了。
16:03
这个站就返回了,返回来过继续执行这句话,这句话是不是就打出main函数里面的这个N的值,这个N的值是不是已经被修改了,当然就打出十,就这么来的。就这么来的,你理解了吗?应该说还是比较好理解哦。没有,没有什么难度吧,同学们就说这里面大家一定要记住,就是说如果我们想通过函数内的变量修改函数外的变量,可以传入这个地址,也就是说按传指针的方式来玩。对,这样呢,我们从效果上就好像是引用传递,就是有些呃,有些书上说的叫引用传递。好,这这我就讲到这啊,这个案例我们就说到这儿了,没有任何问题,而C语言呢,它不支持函数重载,什么叫做不支持函数重载,我简单说一下G,它不只这样子。比如说你这里有个F f2,你不能这样区分,说老师我写个F,还写个F2,但是呢,我给他两个参数。
17:00
我给他两个参数,注意你这样写呢,他仍然认为F2是被重复定义了。再说一遍,就是如果你这样写哈,你你说诶这有一个参数,这有两个参数我能够是能够区分的呀,但是我们说了C语言不支持函数的重载,即它只认这个函数名称,你函数的变量不同,他认为也是同一个函数,因此呢它会报错,我们可以来试一下。我给大家。生成一下解决方案,你会看到它会告诉F2是有函数体了,看已经失败了,在哪里呢?在这里。是不是他说这个地方看。他说这个F2已经有主体了,他说你前面已经定义了一个了,是吧,前一个定义,因此这个我们就称之为它不支持重载C语言。C语言不支持函数重载。即即即不能通过参数。
18:03
的个数不同。个数不同或者。或者类型不同不同来区分,来区分函数,就这意思。就你不是说啊,你有一个参数,我有两个参数,我认为F1F2是不同的,不是这样,它不它不能通过这个来来区分,所以这一点大家一定要认真的小心注意。好,这是第七个,我们讲完了,最后一个呢,还有一个C语言,它支持可变参数,这个呢,我说了知道就可以了,一般来讲呢,我们很少去考察大家。比如说现在我有这么一个变量,有这么一个形式,我有一个函数。但是这个函数呢,我并不知道我将来有几个参数传进去。模式变化的可能是两个,可能三个,可能是四个,我不知道,那怎么办呢?它也支持这个可变函数,具体来说就这样写的,大家知道就行哈。前面呢,他传一个参数的个数,然后后边呢,你就有多少个,你就传多少个。
19:06
那这边呢,他有个I有个total number,比如说我们我们这个任务是干什么呢,大家看。我们这段代码的任务是编写。啊,我把这个往上提一下啊,大家可能看不清楚。就是编写一个函数叫function,求出一到多个int的和,但是呢,他说是多个,多个就是不确定的,可能是两个,可能三个,可能是四个,我不知道,所以这个时候呢,我们就可以使用这个可变。参数函数来解决,可变函数呢,它是一面关键的就是有个V1,这个V1呢,实际上是一个字符指针,大家还没学指针,不要着急哈,它从头文件里面可以得到,还有一个va star,这个呢是va指向可变列表的第一个值,即number后的第一个参数,然后呢,可以遍历获取。啊,这样就可以通过一个叫va argument,该函数呢,可以返回VE指向的值,并使V向下移动一个int的距离实其指向下的换言之就是我们这个地方呢,可以不停的去获取到后面传递的实际的行,实际的这个行参。
20:17
最后关闭这个尺寸就OK了。那这样子啊,这个呢,虽然是知道,但是我也给大家运行一下好不好,大家知道,大家体验一下就行了,这个呢,我们嗯,不做详细的介绍。但是呢,大家知道就行,我写一个方式。可变啊,就是叫做。多个参数吧,Multi。那个parameter。Parameter这个方式好吧,给大家演示一下就可以了。那同样道理,我把这个呢先注销。成这个改成C。那我把这个往这一放哈,大家看一下,那这个时候它会报错,报错原因第一个呢,我们需要引入STDIO。
21:02
SDDIO,这个是我们要引进去的,还要引入一个文件,这个文件呢,就在我框子里面写的一个头文件,叫做SDD。H把这个引进去才可以。那允许这边就不会再报错了。那么我们现在来用一用,看看怎么用哈,这是这个就是我们所说的可变。可变函数。什么叫可变函数呢?即,即它的参数的个数,参数的个数可以不确定。不确定,以前我们都是确定的嘛,对三个四个,但现在不确定,用三个点表示,这三个点就是这样写的啊,就是用使用三个点。是用三个点表示啊,不是四个点,也不是两个点,必须是三个点,我给大家演示一下贸易的。好,我写一个主函数,现在呢,我们来调用这个方式。
22:01
好,假设这次呢,我传递是三个参数,我写个三,注意这个number表示什么意思,我说一下。说明它的这个number表示表示这次表示传递的,注意听表示传递的参数个数。而后面这三个点呢,三个点表示是后面表示。表示后面可以可以传递传递。传递多个多个参数。当然这个参数的个数呢,要跟number匹配就可以了,和什么呢?和NUMBER1111一致对应就可以了,一致即可。好,这样子同学们看一下啊,这个地方就是拿到一遍,然后这一个负循环,大家看懂了没有,我把所有的遍历一下,遍历完了过后呢,每来一个我就累积。并且我这也把他的每次取得的取到的这个值打印出来了,我们先这样子,先把这个关掉一下。
23:06
先关掉一下,你们看它便利的时候,这个V衣到底是什么东西好不好?我来传一下,比如说传一个十,传一个30,再传一个60。好,概率看一下。同学们看一下,一旦我运行会得到什么呢?它其实是这样子的,它通过这一个,嗯。啊,这样子,这这个地方我们就。从这可以每次取回来一个啊,我把这个打开。从这我们先不要去算它。同学们看这个地方呢,我每取一个,我们这个地方每取一个就会取到这个值,我们把这个从这打开。改一个名称啊,V,我们看这个地方每取一个,它是该函数返回VE指向的值,V1是一个指针,它相当于说它每遍历一个int。这个距离呢,就取一个,说白了这方就应该输出什么呢?就是V等于。
24:01
等于这个十,第一个是十,再输V等于30,再输等于60,明白了吧,那我运行一下啊同学们。我把这个先注销。好跟上思路,不要着急哈,不要着急,这我们都能听懂,运行一下。运行起来过后呢,我们可以看到它的确应该是输出这样一个内容。看到啊,你看第第一个这个微星,它第它指向我们传进去的第一个参数,后面就依次取出。那当然同有些同学老师我能不能多写几个呢?可以你要多写一个,比如说你要传这传四个,前面写四,然后呢,你可以再传一个负100,它也是能拿到的,看再执行。对,这次呢,他就取出四个字。是不是十三十六十负100。是不是负100最后一。那这样子的话呢,就有好处了,因为VR呢,每次取出来是一个,于是我就可以把它累积起来。累积起来过后呢,我把最后这个结果返回好,我把这个结果打回来看一下。
25:03
收一个哈,Int res等于好,最后呢,我打印出来就是本次这次结果是。和和是多少呢?百分号D来走R运行。跑起来。那每次诶这个地方不好意思没有关闭啊,它会报错的。再来。这次呢,我们就应该打出和是这四个数的和,诶为什么是零哈,哎,就是010加30加60再加一个负100正确的,当然你说老师我还我还想再写多写一个,可以写个一五七八十九都可以,但是但是一定要记住你这写了几个参数,叫前面这个参数的个数要给他保持一致,因为你在遍历的时候呢,你按这个来遍历的嘛。你看这个给定number值来编译了,所以这个时候呢,用应该12345678哦就八。好,一样可以完成这个任务,跑起来。
26:00
好,这个就是我们的可变函数就讲到这里,好,最后一个是98对不对。好,这就是我们的可变函数就讲到这了,那最后呢,我们还有一个题,我们来一起做一下,加深一个印象,加深一个印象,这里面最重要就是这个地方啊,不要小看老师刚才讲的一个指针传递这个喊这个这个。机制是一定要理解的,那现在我们来做一道题。嗯,做一道什么题呢?我们来一起来做,写一个。好,我们写一段代码。这个我们就叫function detail的一个练习,Exer c好不好?好,跟着我的思路,Include std IO,我们学东西呢,都是由简单到复杂,是不是这个道理,我现在写一段代码。他说啊,要求我们写一个函数,可以交换N1到N2的函数的,这个签名呢,他已经给我们了。
27:00
就这样一个形式。好,那我就按照这个写了来VO,因为没有返回值。嗯,那大家可以看到,我们在这做一个说明,从这里可以看出来函数的名称,函数名为是。第二个它的形参是两个指针类型。指针类型,指针类型都是特星说明什么呀?N1和N2是指向特的,这种指针能理解吗?现在它要交换,它要交换这N1和N2的值呢,我们就可以这样写了,来走一个temp,我先。做一个临时变量,然后呢,我访问到N1这个值。这这句话是什么意思?这句话是把N1这个指针指向的这个值赋给temp,这句话一定要理解啊,这句话表示表示。表示将N1。N1是个指针,N1这个指针。
28:00
这个指针指向的变量。的这个值值赋给temple,能理解吗?紧接着我们再做一个动作,新N1。因为这个是取值嘛,这个是取出N1指向这个变量的值嘛,N1那等于什么呢?好,我来写一个。N2。这句话表示什么呢?哎,这句话应该这样理解了,表示将N2这个指针指向的变量的值赋给哪一个呢?付给,付给N1。注意听付给N1这个指针,这个指针。指向的变量。这个能理解吧。待会我们再画图吧,这个大家可能一时半会理解不了,再来一个N2等于temp这句话很好理解,将表示将什么呢?诶,我还是写表示将temp这个值。Temp。
29:01
Ten前这个变量它的值。它的值付给谁呢?OK,付给N2这个指针指向的变量。就完事了,那当然这几句话呢,听起来有点绕口,我们待会呢画一个示意图,大家一目而了然,那这样我们玩一把,先来,我写个N1。N1,在me这个函数里面,我们写一个一,再写个N2,比如说这个写一个二吧。好,现在我要交换他们,怎么交换呢?Swap,好,我传入第一个数的地址。因为它是指针嘛,第二个。数的地址好,完成了,现在我跟同学们说一句话,请,诶,这写错了。请思考,请思考,现在M这里面的这个N1等于多少?N2又等于多少?来,N1打出来,N2打出来。
30:00
如果不出意外,如果不出意外,同学们我可以负责的告诉大家,我可以负责负责任告诉大家,N1其实已经变成了二,而N2变成了一。交换了。那有些人说是你试一下呗,好试一下,咱们就试一下,没关系,我们先看看代码有没有错误。我生成这个解决方案,看看代码有没有问题,我发现呢。没有任何问题,正确的,现在我运行一下来,走起来,我们可以看到,诶,你们有发现N1的确变成了二,而N2变成了一。交换了,那到底它是怎么交换的呢?诶同学们到底这种代码是怎么交换的呢?我们来给大家分析吧,好不好,我把这个拿过来。拿过来过后呢,为了这边好看,我得把一些乱码去掉一下,所以说我写一个文本文件能理解我的意思哈。我写一个文本文件,打开这里。好,然后呢,我把这一段代码还是要附到付给到这边来。
31:04
因为这里面稍微涉及到一点逻辑的东西,或者说稍微有一点的难度,老师呢,稍微的慢一点,好,同样各位同学跟上我的思路,现在这个仍然是我们的计算机内存没问题吧,同学们。现在呢,我们仍然有一块占空间,没问题,同学们这是占空间,我们看一下它是怎么玩的,好上来过后我们代码呢,是从这边开始执行的,首先有一个。主函数。OK啊,这是我们的。函数主函数呢,我们认为这个主函数它就是一个站嘛,它其实就对应一个站,那这个时候呢,N1对N1,它这个变量呢,对它这个变量呢,就应该是一。对,当然他这个呢,也这个是个变量,肯定就是地址这个我用不说我假写啊D x112。N2是不是一样的道理啊,N2它也有一个空间,现在这个值是二,能理解吗?同样它也有一个地址,假如这个地址是0X1133啊,我就我就随意了,同学们。
32:07
那这个时候呢,它调swap了,Swap它怎么调的呢?它传的是一个N1的地址,还有一个N2的地址,是这样子吧,好一到调用这个函数是不是就会产生一个函数站是不是讲过的。这边我们可以理解成有一个这个swap函数。那么S外函数呢?它也对应一个站,此时此刻代码就执行到这里来了。它在这里呢,同学们首先看这个N1和N2是两个行参,这两个行参一定要分析出来,它是地值,它是指针,所以说N1呢,它对应的这边存的地址就是0X1122。当然它自己也有个地址,比如说它自己的例是00X1144,我就随意哈,同学们,N2呢,它也是一个指针,因此呢,它也有空间,这里面存的是什么呢?是N2的这个地址,那就是0X1133,但它自己有个地址0X,比如说155,所以那换言之,大家一定要非常清晰的知道N1它这个地址实际上是指向他的。
33:13
而N2。它的这个地址是指向我们这个变量的,这个大家一定要分析出来。你这个地方如果没有分析出来,那后面代码就不好分析了,好,完了过后大家看这句话,N星号N1。他执行了这样一句话,哦,所以这句话星号N星号N1是不是。同这个地方,它访问到它指向的这个变量,其实就是个一了。也就是他现在把这个一这个值取出来了,明白这个意思吧。这个能理解吗?你你看吧,这个这个这个这个颜色我们换一个换成一个黑色看清楚,也也就是说现在你这句话就是星号N1,这句话其实相当于这个箭头,这这个动作它指向哪里去了呢?也就它通过这个N1这个指针能够取得这个一这个指是不是讲过吗?这个星号N1。
34:08
是这个指针指向变量的值吗?已经讲了很多遍了,星号N1代表是取出N1这个指针指向的那个变量的值。那这个值是多少?是一,好,是一的话,各位朋友,那此时此刻我们这个ten就应该等于几呢?等于一了。紧接着,他执行下面一句话,这句话很关键。这句话是把N2 N2就是N2这个这这个指针指向的值赋给N1指向的值。那当然就很简单了,你想想你N2,你你N2现在指向的值是不是这个地方啊。他把这个二赋给N1指向的这个这个变量的值,那相当于说什么感觉相当于把这个一换成了二,能理解吗?应该很好理解这句话,我相信大部分同学的理解啊,相当于把N2取得N2指向这个值赋给了N1这个变量指向的这个空间就相当于把它覆盖了,紧接着他就执行这句话。
35:11
Temp把temp这个值赋给N2这个指针指向的这个变量,是不是写到把temp这个N2这个指针指向变量,那言外值就是把这个一付给谁了呢?付给这个地方了。交换的。这个时候代码就结束,结束过后回到这边执行这句话。此时此刻,你看在在这个main函数里边,它在输出这个N,一显然就是二,输出N,二显然就是一。代码分析完毕,代码分析完毕,好了,老师就说到这啊,已经讲的很细了,你要再讲细一点,这个课就没法再讲了,因为这已经讲到我们这个计算机底层的这个地址这一块了,再往下面讲,我也不知道怎么讲了。就你这个人还听不懂。那我就确实是老师就没辙了,好吧,你好好理解一下,我相信同学们都能够听懂。
36:06
好好理解一下,那各位同学,那现在老师把刚才讲的这部内容做一个简单的梳理好这块很重要,那刚才呢,我们讲的是函数的注意事项和细节讨论来捋捋。跟着老师思路啊。跟上老师的思路。那刚才呢,我们讲的是函数的注意事项和它的细节讨论。有些有举案例,有些呢,因为比较简单,就没有举例了。好,这是前面七个。前面七个呢,我给大家标成一个线号。那这七个里面哪个有案例呢?看一下。好像这个是有案例的。这个是我举了一个案例,好,我把这个,呃,这个题好像也举案例了,好,我把这个案例给大家拷贝过来。好的应该是。这个地方举了一个案例,找一下。是函数的细节。好像是在这。
37:03
打开它。是不是在这儿讲的呀。我看下。对是这地方讲的是F2这样讲的。就是呃,讲的这这个自传体不会影响到原来的值,就是这句话是不是。是这个地方吧,同学们。把这个拿过来。拿这边来拿,拿到这边来过,这这个稍微要看看怎么整理一下代码啊,整理也是非常重要的,对。是不是这写了一个F2,然后呢,我们调用的时候是怎么调用的呢?是不是在这测试的呀。是不是在主,呃,主函数里面,我们是通过这个案例来来测试的是吧?好,我把这个拉过来。这个拿过来过呢,我要稍微的梳理一下VO的。啊,跟着我的思路啊,因为这地方整理呢,是也不是特别好整理。好,我把这个拿把这个。把这个拿掉就可以了。大家可以看到,当我们这样去运行的,诶,这面已经有主函数了,就不要再再来一份,也就是说当你在这个地方调用这一个主函数的时候,它是九。
38:09
而在这里面呢,它是十啊,第一个题是这样子的,第二个呢,就是如果说我们就要去改变,怎么办呢?也有办法,也有办法就传指针,大家康就是这样写的。是不是这个小案例啊?把这个呢放这儿,紧接着我们这儿有一个主函数。诶,要是我们怎么使用的呢?OK,那就是这样使用的,打开它是不是在这啊。在这儿。OK,在这我们把它放进去,那这样子的话,我们把这个去掉。那这个时候你用了,你会发现这边这边因为你这改变变成十了啊,这边变成十了,呃,里面这个呢,也是十就会修改,诶那上面这个应该是九哈,把它改过去,因为你你这个地方是属于那个子拷贝吗?那那那你这边加加不会影响到主函数里面的,好这个讲完讲完过后呢,我们第七个没有举例,我们紧接着又讲了一个什么呀。
39:01
第八点就是这点是C语言支持可变函数,这个细节大家知道啊,就说别人问到你说诶C语言支不支持。可变函数,你说知道呃,可以的就行了啊,具体来说这个案例呢,我给大家。拿过来就行,好吧,也不难。就是。要知道有这么回事儿。拉过来。最后这有一个小小的梳理啊,梳理在这。他的要求呢,是在这里。啊,那这个这个题应该这么去用呢,那我从从这来来来来复制吧。这这面所有的思,呃思路,还有那个调用我们都有,那干脆就从这拷贝。好吧,这样拷贝呢,更简单一点。那这个说完了以后,是不是我们给大家做了一个课堂练习题啊,就是加深对这个细节的理解。各段练习题,那这个各堂练习题呢,我是怎么做的呢?OK,要求其实是特别简单哈,就是编写这么一个swap函数,能够通过指传指针的方式呢,能够改变什么呀,能够改变N1和N2的值,那具体来说这个解决方法是老师这样写的。
40:13
是,我把这个给大家换过来。来放,这最关键的是对这个代码的分析,是精华部分,就是对上面代码的一个一个执行机制分析。这个是一个重要点。就说你在学。你在学我们这个C语言的时候呢,这个地方是显得尤为重要。我给大家放这来,那具体来说是哪个图呢?就是刚才老师花了一点时间来画的这个图,就是这个图。包括这边的注释我都写了哈。就这边对应的个图就是这。好,各位同学,那关于这个上面这个代码的机制的分析,我们就给大家讲解到这里,包括函数注意的事项和细节,说到这里大家一定要认真的去理解好不好,各位这一讲我们就说到这里。
我来说两句