00:02
我们有了这一个指针和地址的概念过后呢,我们下面就可以来探讨一个C程序里边一个特别重要的概念叫什么呢?值传递和地址传递,因为现在大家对地址和值有了一个认识,对不对为前面我们已经说到。是这个值和地址的关系了。我们先来看直传递和地址传递的特点。我们先说直传递。先说直传递,什么叫做直传递呢?在前面我们这有一个,这边有一个基本概念C。语言传递参数或者叫做赋值呢,可以有两种形式,一个叫做值传递,叫pass by value。也可以是传递指针。A pointer pass by value,也就是说这个时候按指针来进行处理,本质传的就是地址,因为传递指针也叫传递地址。
01:01
那有些同学老师,那什么数据类型是只传递,什么数据类型是传递指针或者是地址传递呢?我这里做了一个介绍。默认传递值的数据类型有这么几种基本数据类型,比如说咱们的整形小数型。字符型结构体,共用体这些呢,它默认都是按值来进行传递的,那有些同学说,老师值到底什么意思,不要着急,我待会马上举例哈,先把这个先把它的分类说清楚,然后再举例。就说你至少你的脑海里面要记住老师说的这几种数据类型,它是按值传递的。默认传递地址的,或者说传递指针的呢,有两种,一个是指针,一个是数组。那现在呢,我们来具体的说一下,何为直传递,何为弟子传递,我这里有一个幻灯片,我们来看一下。比如说。
02:00
比如说这大家看到这有一个,呃,111个框框,我们来写一下,比如说我在这里面再写一句话。这句话叫int。NUMBER2等于number。往上面来一点。这个颜色可能大家有点看的不清楚,我把它换成另外一个颜色,比如说浅了这个颜色大家看。我这里有一个100给了NUMBER1,下面呢,我这里有这样一句话,把number付给了NUMBER1,这个地方就叫值传递。那如果在第一句话执行完毕过后呢,过后呢,内存里面是这样子的,这有一个100,当然这个空间是有个地址的number呢,通过地址。指向了我们这个空间。那当我们执行了这样一句话过后呢,我们内存里面会怎么做呢?内存是这样做的。就是现在我们在讲什么叫直传递哈。啊,那也就是说它会产生一个变量。
03:02
Number。NUMBER2 number2呢,他会干什么呢?他也会,他也会拿到一个空间。也会分配一个新的空间,这个是肯定的,我依然给他来一个格式哈。我依然给他来一个格式,比如说呃,这这个颜色的吧。这个颜色,那么它会怎么办呢?大家发现没有,但当然他这也有地址。可他这个空间肯定有个地址,这个地址我随便随便写一个号,比如说零零。那这个直传递怎么体现呢?它会把这个地方的100注意听。他会把这个100。给我们复制到这个空间。明白,然后呢,这个number,也就是同学们看到这个这个number呢,也就指向这个空间了,它是这么一个逻辑逻辑。所以说这个呢,我们就称之为值传递,说的再简单一点,它就是把这一个number的值复制一份到他的空间。
04:03
就是这行呢,拷贝一份给接收变量就是,所以这里就将变量指向的存储的内容。在传递和负责的时候拷贝一份。给这一个传递的就变量就是这是一个值。那有些同学老师那。那我问大家一个问题哈,我问大家一个问题。如果是直传递,我问大家一个问题,假如说假如我这里修改了一个。比如说我把NUMBER2改成了40。那number原先这个number有没有变化?从这个图上来说是没有变化,也就是说磁传递有一个特点,就是当我们把这方改成40过后呢,这个地方的100是不会变化的。所以这个呢,我们称之为直传递。紧接着我们看什么叫弟子传递呢?地质传递又叫指针传递。如果是指针,就将指针变量存储的地址。
05:03
传递给这个接受的变量,如果是数组,就将数组的首地址传递给接收变量。我举个例子,比方说同学们看,还是以这个为例。还是以这个为例,比方说现在我这里有一个。有一个number number等于100,那么他在内存里面呢?会这样生成,是不是这个道理?然后呢,我把一个地址赋给了呃,付给了一个指针P,那它在这个地方,它会怎么做呢?同学们注意听哈。这地方会产生一个变量P。他也会有一个空间,它也会产生一个空间。这个空间当然也会有自己的地址了。但是注意这时他是把这个。Number就是把这个number的地址这个值就是0X11223344放到这里面来。所以说我们把这个称之为什么呢?传递指针,或者叫指针传递,也就是他是把这个地址放到这里面呢,并没有把这个100放到这里面,也就说说的再直接一点,就这个地方并没有把100给你拷贝过来,而是把什么呢?而是把他的地址,就是把这个number的地址给到这边来了。
06:20
所以说我们管这个呢,称之为弟子传递,其实同学们有没有发现,不管前面讲的是值传递还是弟子传递,其实都是一,都是一个值。因为你递址也是值嘛,只是呢,咱们为了区分它到底是指的存放的这个内容还是地址呢,我们把它分为值传递和递子传递,但是不,理论上从这个本质来讲,递子其实也是一种值,只是呢,为了区分,呃,为了跟它区分一下,我们所以说把这个称之为直传递,把这个称之为地子传递。当然他这个他这个呃,不同的传递方式呢,在操作的过程中也会有变化,你比如说同学们再看。
07:06
再看,如果我这里再来一个特新P2,然后呢,我写一个P。那我问同学们一个问题。我问同学们这句话。会在内存里面怎么呃,出现一个什么情况呢?是不是这样子的,它也会产生一个变量叫P2。这个是肯定的,然后呢,它也会生成一个空间,比如说我们插入。一个空间。他也会有自己的一个空间,这是肯定的,对不对,这是肯定的,好我们给他一个这样的空间的,这个空间里边呢,大家可以看到你把这个P放进去,其实这个时候啊,他给的是哪一个,我问大家。这时,他给的是。这个值呢,还是下面这个值。到这个空间里面去。呃,我我再多说一句啊,就是你现在就说我们现在讨论的问题是,当我把这个P付给这个P2的时候,这个地方。
08:09
他是把这个东西扔过来。还是把这里这个0X1122331122呃33AA放到这里面去呢,到底是哪一个,你们认为。你们认为是哪一个呀?你们认为是哪一个同学们?其实同学们要知道,它在这个地方要传递的话呢,它传递的也是这个值。是这里面这个字,而不是个地址,因为你前前面没加地址嘛,如果说这样子啊,你这是传的是他。这个这个一定要理解,因为我们在面试的时候,或者是在做题的时候呢,经常会有这样类似的这种这种概念出现在我们的题型中是这样子的。这点大家也就是说实际上它是把这个P里面存放到这个东西放到里面来了。
09:01
那当然了,这这个P2呢,也有自己的一个空间嘛,他有自己空间,我就随便写一个号,比如写成CC吧。为了一些区别,那同学们看这样一个情况会导致我们内存会有什么变化呢?同学们请看这个图。也就是说这个时候P2指向这个空间,这是肯定的,我给它来一个绿色的线。然后呢,呃,然后这个P二指向他,也就是说实际上我们这个P2呢,也通过这个地址指向了哪里呢。实现这个东西。啊,这个有点不好画了啊。我同样给它来一个绿色的线。那为了好看呢,把这个拎到上面去,往上面提一下。诶,这个怎么提不上来呢。看一下啊。就动不了,动不了。哦,这样子吧。我这样子画。好,这样子大家应该看的比较清晰一点,也就是说现在其实相当于P,它指向了通过这个地址指向了number,而我们这个P2呢,也通过这个地址也指向number,那我问大家,问大家如果说我说啊,我说我如果说我这里写的是新P2。
10:21
因为这面稍微有一点点,有一点点绕,我多说几句,如果星P2等于我给它附了一个值,比如说写成了55。请同学们思考这句话,这句话会导致哪个地方的纸变化。哪个地方值是不是就是这个number这个就变成100,就变成了55了,也就是说这个地方就变成了55。那这个时候我问大家,你用星号P和星号P2以及number去访问,是不是都是五,都是都变成55了。这个一定要理解啊,所以说我们这把这个就说清楚了,就通过这个递,什么叫直传递,直传递就是把这里面的这个放到这边来,值呃值诶这个这个值,那么如果是地址的话呢,地传递地址的话,相当于是把它把如果是前面加了艾特福,就相当于说把他这个地址的值给你拷贝到这边来。
11:18
那如果你是把一个指针。这个P又给到P2,那这个时候仍然是拷的,这里面的内容拷贝进来,那有些同学老师我想把这个拷贝进来,怎么办呢?那前面再加地址。那就他就变成二级指针了,要你像这样子给是吧?啊这样子给那就是另外一回事了啊,我们后面再讨论这这个情况一情况。好,那有些同学老师你试一下呗,看看我们这样改动了过后,是不是真的这样子了呢?来,我给他上面这个不演示了。上面这个我不演示了,因为这个这个只拷贝,你改变NUMBER2,不会影响到他,这是肯定的,这个地方可能稍微有点绕,我们来证明一下。来打开我们这个地方,我们来简单的测试一下好不好,先测试一下,那现在我们讲的是什么呢?就是指的地址传递的一个概念,小队。
12:11
叫A。Address address pass好吧。DEMO好,同学们,跟上我的思路啊,跟上我的思路,Include。Include。当然,Std。L。然后我在这里面写一个VO。主函数,然后我把代码呢扔这儿来。我格式幻想。这里我格式化一下。好,那然后然后这边呢,我们就把这些该给的分号给上,要没给分号肯定是要报错的。好,我们再格式化一下。好,这次呢,我们我们来这样输出一下,看看这个结果我们想的是否一样好不好,首先number等于多少,然后呢。呃,星号就是P指向的就星号P吧,那就这样写,星号P等于多少,肯定是个值了,那就百分号D了,然后呢,星号P2。
13:11
它指向的值,我们把它输出,输出的时候应该怎么输出number。然后呢,之前呢,我要用星号P来访问他星号P2。来访问,那如果不出意外,如果不出意外,那么这些地方应该输出三个55,一个五十五两个和三个,也就是说这这个地方的输出就应该跟我们这边分析的是一模一样的。能理解这意思吧?好,同学们,我们先来运行一下,我们先编一下,看看有没有错。先生成一下生成这个解决方案,我们看代码有没有毛病。好。呃,有一个小问题,应该是前面咱们有一个地方没有注销。
14:00
看一下啊,应该是前面有一个,我们刚才讲的这个。啊,这个地方有个主方法,没有注销,把它注销一下。好,然后呢,我们再来编译哈,我们再来进行一个重新生成解决方案。好的,现在没有任何问题。我们运行之。我们运营起来过后呢,我们看一下这个效果是不是全部都是55啊。也就是说刚才我们这个分析呢,应该是正确的,就是说呃,如果你加了一个艾特服务,这个就叫地址传递,那么如果说你在进行指针传递的时候呢,其实它还是把它这里面的内容放进来了,而不是这个我就做一个区分。这点大家一定要认真的理解好,认真理解就看你当时传递的时候有没有加爱。你加了艾德普,就是按照地址传递。按照地传递,那当然了,说老师那那如果说后边我们在刚才不是也讲了吗?如果你是一个数组,那么这个时候呢,它默认是把这个数组的首地址传递给接收变量,我们讲到数组的时候还要谈这个话题。
15:08
好,这是我们讲的关于值传递和地址传递的。这么。两个概念好,关于直传递、粒子传递,我们就先给大家讲解到这里。
我来说两句