00:00
大家好,那现在呢,我们在给大家把函数参数的传递方式再做一个系统的回顾,实际上我们在前面已然讲过了函数参数的传递方式对不对,包括什么值传递以及引用传递,其实都已经讲过了,那么在这里呢,我们在系统的把它再说一遍,大家呢在就说在系统的认识一下,我们来看一下我们在讲解函数注意事项和细节的时候,已经讲过了值类型和引用类型对不对,这里我们在系统的总结一下,因为这个地方是重难点,所以说我这比较重视它。同学们呢,在开发的时候呢,也是经常会用到这个知识点,在我们的构语言里面呢,它的传递方式,在我们函数参数传递的方式里边,主要有两种,一种呢,我们称之为直传递,比如说前面我们讲的基本数据类型,其实它就是直传递,何为直传递?所谓直传递就是说在传递参数的时候,它进行的一个直拷贝啊,这个就是直传递。第二个呢,我们叫引用传递,所谓引用传递呢,其实它传的是一个地址。
01:07
但是呢,大家看到我这说了一句话,实际上直传递和引用传递的本质啊都是一样的,什么呢?说不管你是直传递,大家看到其实不管你是值传递还是引用传递,传递的函数的都是变量的一个副本。不同的是什么呢?直传递是直拷贝。就是他传的是个子拷贝,你比如说你给他传了一个六,是一个整数,那么你传过去给这个函数以后呢,这个函数也得到一个新的这个六。而是一个值,那么如果是引用传递呢?它是地址的一个拷贝,你比方说我们前面讲过的指针。大家还记不记得指针,诶,我们回顾一下喽,我们回顾一下,打开我们的笔记,大家看在讲函数细节的时候点到这里来,我们讲到第六点的时候,大家看到没有,如果希望函数内的变量能够修改,函数外的变量,我们可以使用。
02:07
什么呀,引用传递对吧,我们使使用这个指针传递,其实就是引用传递,传输的是个地址,你看大家还记不记得。大家看我们在这个TEST03里面传了一个地址过去,我们传了一个地址过去,看到没有。传的地址给谁呀,给到这个。这个东西这是个指针,我们知道指针它其实是引用传递类型。那你你这个仅指针,你传递值的时候,其实也是进行了一个拷贝,但是拷贝呃,也是传递了一个具体的一个一个值,过去只是这个值呢,它不是什么呀,他不是这个20。他不是这个20这个具体的这个这个数据的内容了,而是什么呢?而是这个地址,你比方说你你传地址的时候,其实你是把这个数的这个地址传给这个这个地方了,是吧,其实你还是进行了一个拷贝,但是拷贝的内容是什么呢?是这个变量的地址给他的。
03:08
所以说本质上。所以说为什么为什么,我在这儿总结了一句话,总结成一句话说。就是传递给函数的都是变量的副本。只是值传递的是值的拷贝,而引用传递的是地址的拷贝,能理解了吧?说本质上其实都是一样的,但是唯一不一样的就是拷贝过去的这个变量的副本不一样理解。那么一般来讲哈,地址拷贝效率要高一些。大家知道这是为什么吗?因为你拷贝的时候就是一个就是一个地址嘛,那当然相对来说效率要高了,你比方说同学们看,同学们看这里。我们还是以这个图为例,你比如说假设我们这个number是一个,是一个,是一个数。拷贝一个数过去和拷贝一个地址过去效率肯定不一样的,地址它比较小一下就数据量比较小,一下就传过去了,对吧?你再比如说后边我们学到一个结构体,那结构体它可能是一个内容量很大的一个一一个结构体,那这个时候我们如果把结构体,因为结构体默认它也是只拷贝。
04:16
那如果说我们用纸拷贝过去,那这样子就就会就会拷贝一个很大的数,这个数量就很大了,效率就低,那如果说我们传递的是地那个结构体的一个地址呢,诶,那效率就会很高,明白这意思吧。所以说我们能够看到它的区别是是效率的问题,地址的拷贝效率要高,因为数据量小,而子拷贝呢,决定拷贝数据的大小,数据越大,效率越低。对不对,所以说我们在实际开发中呢,往往有这样一个需求,如果想提升一下效率,提升效率,那么往往我们会使用什么呀,地址拷贝,也就是说。使使用这个引用传递的方式来处理。
05:00
好,这就是我们所说的两种传递方式,那我把这块呢,先给同学们整理到我们的笔记里面去。OK。好,老规矩放到这里,我们系统的把它总结一下,刚才讲的是函数。函数参数参数传递传递方式对不对。我给大家来一个小标题,来一个标题二。然后呢,刚才我们说到了第一个就是基本介绍,我们做了一个基本介绍。然后呢,我们这总结出来,这个在高浪里面呢,它有两种传递方式,对不对,有两种传递方式,也把它整理一下,第一种呢,诶这个地方有问题。这是我们的标题三。对吧?标题三,第一种方式呢,就是我们所说的值传递。第二种方式呢,就是我们所说的引用传递,但是我在这做了一个总结,就说直传递也好,引用传递也好,其实都会传一个变量的副本,只是直传递传的是子拷贝,引用传递是地址拷贝,那么他们还有什么区别呢?一般来说,就一般来说呢,引用传递它的效率要高,因为它传递一个地址嘛,子拷贝如果你这个值很大,比如说是一个大的结构体,那你这个就非常的耗费,耗费资源了。
06:24
所以说是这样子的啊,同学们注意这个区别,注意这个区别,好,那下面呢,我们就来再回顾一下,大家回回忆回忆值传递和引用传递分别有哪些数据类型,还有还有印象吗?大家回忆一下,是不是我们讲过直传递一般是基本数据类型式直传递,另外呢,就是我们讲的像这个,呃,就是我们刚才说的宿主也是直传递,还有呢,就是结构体也是直传递,其他的呢,我们都几其他的类型呢,就是引用传递,我在这也做了一个整递,大家看一下。看一下啊,直传递和应用传递有哪些在勾勒里面基本数据类型,比如说像in特尔float布尔string,还有数组和结构体,这些呢,是直状体,就是刚才我说的。
07:13
其他的类型呢,比如像指针、切片、map管道interface这些都是引用传递,就默认是引用传递,那在这里引用传递其实我们就讲了一个指针是不是像切片map管道interface我们还没讲过,但是呢,我把它先。我我先把它放到这个地方,大家有个初步的印象,OK,好,大家记住啊,这个是一个考点,面试官,包括我们实际周开发的时候呢,也会经常用到这个知识点,你要非常清楚的知道哪些是值传递,哪些是引用传递,这样你在做开发的时候呢,才会不迷茫,OK,我把这一块呢,也给大家整理到笔记里面来。这是刚才讲的引用传递值传递有具体有哪些分类?好,我们给它放一个,那刚才老师整理了一下啊,大家老师在板书的时候,其实是希望大家有一个缓冲,就是大家能够想一下。
08:08
OK,直传的有哪些?有个印象啊,同学们。引用传递有哪些?我也给他整理到这了,那现在呢,我们再来看看直传递和引用传递的具体的方式是怎么样子的,其实前边已经说过这个东西了,还有印吧,来看一下老师讲过啊,前面我已经讲过了,再温故一下在哪讲的,还有印象吗?在哪讲的,实际上我在两个地方都讲过,我在两个地方都讲过一个打开我们的笔记。我在讲函数注意事项的时候,在这个地方我讲过。我说怎么去把一个引用,把一个默认的值传递改成了引用传递,还记得吧。在第六讲课,甚至我在讲变量的时候,大家看我在讲变量的时候,这。在讲变量的时候,我也讲过值传递和引用传递类型,在这在第三章讲值值类型和引用类型的时候,其实也讲过,大家还回忆一下看看是不是这也也是把这个也也是讲过的呀,对吧,那么当时呢,我还画了图了。
09:12
还画了图了,只是说老师在这个地方呢,在做一个整体给大家再回顾一下,能理解啊,因为这个知识点呢,它特别的重要,所以老师花了一些时间再回顾。来回到这边,跟上思路啊,这个笔记要有效的利用起来,这也不是说吃饱了没事干啊,这个这个笔记我们花费了大量时间去做,所以说同学们呢,要有效的利用,来看一下。一个是值类型,一个是引用类型,那具体来说它的传递方式呢,是这样子的,打开幻灯屏看。直类型,默认就是值传递。它是什么样子的呀,就是变量直接存储值。比如说我们画的内存,比如说number等于100,那这个number呢,它就直接和这个值关联起来了,能理解,就是说他这个number如果取地址的话,这个地址就是你这个值的对应的那个地址,能理解。
10:08
那如果说你是引用类型,如果你是引用类型的数据,那默认就会是引用传递,那这个时候呢,变量存储的是个什么玩意儿,注意变量存储的是个地址,这个地址对应的空间才真正存储的数据。内存一般来讲在堆堆上分配。一般来讲是在堆堆上分配,当没有任何变量引用这个地址的时候,该地址对应的数据空间就会成为一个垃圾,由GC来回收。大家看这里图。比如说我这有个引用类型叫ref,它呢并没有注意看这个并没有直接指向这个值,没有跟那个值类型不一样,它并没有直接指向这个值,它是怎么样子的呢?同学们哦,它是先指向了一个地址,这个地址在指向这个值的。这是引用类型,或者说引用传递的一个特点。
11:02
前面呢,我们在讲的时候,其实也提到这个知识点了,这块老师就不再画图了,好不好,因为其实都已经讲过了嘛,只在温故而知新一下,好的,我把这个呢也给同学们整理到咱们的笔记里面来,这都是讲过的,对不对?来一个标题三,那标题三呢,刚才老师讲的啊,我们这整理了一些东西,那我把这一块给同学们放到笔记里面来。因为这个这块是讲过的,所以说老师呢,就没有再重新画图了。相信同学们也应该能够理解是怎么回事。好,这是一个。还有这个就是值类型,引用传递值类型和引用类型的一个说明,那下面呢,还有一个地方要说明一下,就这里。如果说我们希望函数内的变量能够修改函数外的变量,也就是说如果我们希望把一个默认的值传递的方式改成引用传递怎么办?传变量的地址就可以了。
12:05
大家还记不记得我们在前面说过这个事情,好,老师这就不废话了,我直接把这句话整理到笔记里面就行了。好,第三点。对不对,第三点放这就OK。好的,那关于这块呢,这这个知识点在前面的案例我已经讲过啊,这个案例在哪里,这个案例在前面讲解,详解哪个函数使用注意。注意事项时,事项的地方讲过,应该是第几点讲过的,大家回忆一下,是不是在这第六点讲过是吧?那我把这个腿截过来吧。我把这个图也截过来,因为可能有些同学在这,他懒得回去再看了,我就放到这里来,大家有个印象。把再重新整理一下。好的,那同学们,那关于我们所说的函数参数传递方式的值传递方式和引用传递方式,老师就给大家再回顾到这儿了,希望同学们一定要把这块搞清楚,尤其是这个知识点啊,一定要把甚至要求同学们把它记下来。
13:14
如果这个地方记不住,你后面做开发的时候一定会比较迷茫,这个是一个结论性的东西,一定要把它记住。那关于函数参数传递方式,就给同学们介绍到这里。
我来说两句