00:01
我们再来回顾一下函数传参数的传递方式,其实刚才我们已经把这些函数传递方式已经跟他说的很清楚了,只是呢,这里我们再做一个梳理和一个总结。首先呢,我们在讲解函数注意事项的和细节的时候,我们已经讲过C语言传递参数可以是直传递,对不对?其实直传递你可以理解成就是拷贝了一份,所以它的名字叫pass by value,还有一个叫传递指针,这个呢叫pointer pass by value,也就是说这个时候它传递的是个指针,对,也叫传递地址,或者叫引用传递,这几个叫法呢,都是一个意思。那么传递方式呢,就是我们说磁传递啊,就是引用传递或传递指针传递地址,其实我们这要做一个小结。虽然我们人为的把它分为传直传递和引用传递,或者叫指针传递,其实不管是值传递,还是我们所说的引用传递,或者是呃,指针传递,它传给指针的都是变量的一个副本。
01:06
对,不同的是呢,值传递的是值的一个拷贝。对不对,比如说我们传的是一个int。Int,比如说我们传的是一个int a这边我传了一个九给他,那么实际上是一个值的拷贝,引用传递呢,是地址的一个拷贝,比如说我这边变成一个星号。对,那这个时候呢,我们传的是一个变量的地址,比如说number的地址,那这个时候这个N接收的是也是一个值,只是呢,是我们的,比如说这边是个number。哎,前面有个艾特符号。这个艾特符号就是这样写啊,对对,艾特符号。这样撤回去。艾夫。啊艾,就是说它是把什么呢?把这个number的一个地址传给这个N,其实也是一个值,只是呢,这个值是一个地址而已。
02:01
所以一般来说呢,什么样的效率比较高呢?地址传地址的拷贝效率比较高,因为数据量比较小,而值拷贝呢,决定拷贝数据的大小,数据越大效率越低,你比如说打个比方,如果说你将来传递的一个数据很大。对,是一个结构体,那结构体里面数据就就是一个集合了,那这样传递过去呢,就很就很重,如果你改成传地址呢,效率就会很高,这个大家可能现在还不太明白这个意思,也就是说你这样这样去理理解就行了,就说因为我们传一个值呢,它会整体把这个值都拷贝一份过去,而传地址呢,就是一个地址传递过去,然后让这个地址指向我们的那个数去,当然效率就高了。明白这个意思,好,这是第一点,第二点呢,值传递和引用传递的特点,其实刚才已经说过了,再总结一下啊,我们直传递呢,变量直接存储这个值,内存通常在占中分配啊,讲过了,这里面有几个地方要记存,记清楚哪些是直传递。
03:03
哪些是引用传递或者叫地址传递,默认值传递的数据类型,有这么几个基本数据类型,比如说int呀,Float呀,Double呀啊等等。还有结构体默认也是直传的,也就是说在默认情况下呢,这个结构体会拷贝一份共用体也是还有没绝对性。这几个呢,我们都是直传递,这个我就不去举例子了,因为。这个地址咱们举了很多了,再反复去就没有意义了。还有引用传递,那引用传递呢,它存储的是一个地址,也就是说传的是一个地址,那么这个地址对应的空间才是真正的数据,好,这点大家清楚,那么哪一些默认就是默认引用传递的,或者叫做呃地址传递的,或者叫做传递指针的,有哪些数据类型呢?主要有两个,一个是指针,一个是数组指针,其实前面我们已经用过了,比如说我有个F。OK,然后这边我有个int。
04:01
Int新。好芯P,那这个时候你传递个数过后呢,就是个地址,你传的就是个地址,好,也就是说它是一个地址,它传递一个地址拷到这来,那个地址呢,在指向你原先传过来这个值的那个空间,前面已经讲过这个了,好不好,这就不用多说了啊,不用多说了。啊,然后呢,还有一点就是,呃,第三点,如果希望函数内的变量能够修改,函数外的变量可以传入变量地址,是不是前面讲过了,函数内呢,以指针的方式来操作,那指针方式怎么操作的呢?还记得吧,是星号。哎,星号之争。这种方式来操作的从效从效果上来看呢,就跟我们这个引用传递是一个意思,比如我们可以通过呃,就是传递结构体的指针来修改结构体,就会很方便。那这个我就说到这了啊,后边我们在讲相应的案例或者做题的时候呢,还会反复的用到这个特点,所以大家一定要认真的体会,其实都不难,主要大家只要记住这个图就行了,一个是这个图。
05:08
就是只要是地址都是按照这个流程来走的,如果是值呢,对呃,这个这个题是不是也是讲这个讲这个。指指针传递或者引引引用传递的一个特色啊,如果是值的话呢,它是这样子的。你比如说我们这个,呃,前面讲的这个函数。Test,比如说我传了一个number进去,那么这个时候它会在这个test里面呢,把这个六拷贝到这个N去,这就是区别,那他们之间两个数据就是独立的这个N。N和这个是独立的,当然有些同学老师假设我的变量名称叫number呢,那一样也是独立的,我不一样的就是说你这边在这个test站里面,站里面有个number,只是这个number呢,它也是一个六,但是这个number和这个number呃,完全是独立的,不呃相互不影响,明白这个意思吧。
06:02
就说这个跟变量名称相不相同没有关系啊,所不能说诶这个名称相同我就有影响,不会这样子的,因为你看嘛,这个空间是独立的啊,在说里面是独立的很多同很多初学者在这方永远搞不清楚啊,根据我授课的经验来说呢,很多同学在这老老纠结了,诶他说这个这地方是个number,假设我这个行参也叫number,诶他们两个是不是同一个,怎么可能是同一个吗?对不对,如果你这是个number的话,在这个test的站里面会有一个number。变量啊,然后呢,他把那个六,他把你这个六拷贝到这边来,但是呢,这个整个这个数据都是在这个test的站里面生效,跟你这里面的这个number没有任何关系啊,我再说一遍啊,说的都有点想吐了,我就不再再再说说你一定要理解,但是是引用传递就或者叫指针传递就不一样了,他这边会直接指向它这个地面存的地址,会指向你传递的那个变量的那个那个地址,那他这里面操作就会影响到你这个,呃,Main或者是其他那个对应的这个函数的。
07:07
这个值了,好同学们,那关于这块我们就聊到这里了,梳理了一下,好,我把这块呢给大家稍微的梳理一下。其实这些都讲过啊,都讲过来走一个,那么这边呢,我们说一下函数参数传递的方式,一些特点,一个梳理。好放这儿,首先呢,我们讲了基本介绍对不对。好,两种传递方式,我们也说了一下。啊,一个呢,就是我们说的传递,一个叫引用传递,这叫叫法很多,有些地方叫引用传递,有些地方叫传递指针,有些地方叫啊传递弟子,其实都是一个意思啊,都是一个意思。那两种方式说完了以后,是不是我们还这举一个例子对吧,这里面最重要的是要记住这几个结论,就这个地方默认值传递的数据类型有哪些。默认引用传递的数据类型有哪些?这个是一定要有概念的,否则的话你学了半天,诶,哪些是指传递,哪些是,嗯,引用传递或者指针传递,搞不清楚,那就麻烦了,好,这点一定要一一定要注意。
08:12
这是这块的总结,那这里呢,我就截一个图了。把这个图直接给他拿过来。做到心中有数。把这个图给同学们板书到这里。好,那么这个讲完了过后,是不是我们这里面还有一点对吧,第三点也说了一下,就是如果你希望呃去改变的话,又怎么处理。这这个应该算成第五点了。好,我就梳理到这,呃比比如说我们将来想去修改结构体的话,咱们可以通过呃这个指针的方式来快速的修改,呃不用产生只拷贝了吗。好,各位同学,那关于这个章节我们就聊到这里。
我来说两句