粉丝2261获赞1.1万

当我们搞定了之后呢?哎,等于说老师,那这个行餐和食餐之间的关系是什么?关系是什么?好,接下来我们来探讨探讨一下食餐和行餐的关系。虽然我们前面已经提到了食餐是传递给行餐的,他们之间有联系,但是食餐和行餐之间的联系又是怎么样的呢? 啊?他们之间可以说有关系,也可以说是完全没关系啊,是独立的啊。那我们这个地方简单的通过调试来看一下,大家就明白了,现在我们来开始调试一下我的代码,懂了吧?我们这地方呢,按一下我们键盘的 f 十,我调试起来, f 十调试起来 走,大家看我按的时候呢,我按一下代码会往下走一步,按一下会代码往下走一步啊,这地方走走,往 a 和 b 创建,当 a 和 b 创建好之后呢,我这地方再往下走一步的时候,这 这个 scar 负责,它要输入数据,那这个地方我输入一个数什么呢?比如说十,输入一个二十,我回车一敲 a 和 b 啊,就有值了, 那我想开和 b 值怎么看呢?我在调试窗口里面这个地方给大家讲监视,监视打开啊,这个地方我输入一个什么呢? a 啊,输入一个什么呢? b 啊,这个时候大家看 a 里面放的是十, b 里面放的是二十,说明我这个值是不是真的就输入进去了,放到 a 和 b 里面去了。 而这个 a 和 b 到底放在内存的什么位置呢?我们这儿可以给这个取 dj 看一下, a 的地址是它,当然是这样,为了方便这个地址观察,我们这个地方把这个代码改一下,把这个配置改一下,改成叉八六,叉八六就是三十二环境, 六十四个环境,地址太长了,是一个非常长的地址啊,如果我们买的话,你长不溜的话,那这个地址呢,相对来说简单一些,小一些,我们重新来调试一下,再次走一下 个逻辑,对吧? f 十一,按代码就要开始调试啊,注意,走走走,我爱的都是 f 十,再走,代码在这个地方要让我输入值,我输入十二十。大家看,这个时候过来的时候,同学们仔细看, a、 b 里面分别放的是十和二十, 那 a 里面这个十放到哪去了呢?它的地址是什么呢?我通过取 dj 可以看到, a 的地址是零 x 零零四, f f 八的 e 四,我这地方也可以观察一下 b 放哪去了呢? b 的地址是零零四 f f 八的第八,这是 b 的地址。 当我们了解了这之后说,哎,我马上不是要调 a、 d、 d 函数吗?我怎么去调呢?哎,我想进到 a、 d、 d 函数内部看一下,看一下这个函数调的逻辑,那这个时候注意不能按键盘的 f 十了,要按 f 十一,我按一下 f 十一,哎, 哎呀,注意过来了,过来,来到这个函数里面的时候,大家看啊,这个时候如果你走到这的话,这个 x y 是不是接受了我刚刚 a 和 b 的值呢?我们这个地方敲一下 x, 我再敲一个 y, 大家看 x 里面放的十, y 里面放的二十,说明 a 的值确实传给了 x, y x b 的值传给了 y, 明白了吗? 好。当我们传过去之后,有的人说,老师,那 x 是单独开辟空间呢?还是就是 a 这个变量呢?我们这地方看一下 x 的地址,发现 x 地址是零零四 f f 七呢, f 四跟这个地址不一样啊, 这个地方如果你去观察 y 的话,你会发现 y 的地址是零零四 f 七呢,七 f 八对不对? f 七 f 八,这个跟 b 的地址也不一样啊。哦,那原来行餐部分 x y 啊,单独开辟的空间的,单独开辟的空间 啊,那当我们在这单独开闭空间的时候,同学们想象一下,那这个地方再往下走的话,我们这有了 z 对不对?那这个地方 z 是不是也要开闭空间是零,然后呢?哎, x 加 y, 结果放到 c 里面 z 里面去,大家看,此时此刻你看你 z 的时候,你会发现 z 的值是三十, 然后最终这个 z 的值是不是要带回来,要返回来,是不是返回来之后放到 r 里面去? 那当然在整个过程中呢,大家注意,我们这儿还是想给大家再截个图让同学们呢,哎,把这儿呢给大家画一画啊,画一画出来一些东西 啊,刚刚这个代码在执行过程中,他到底发生了哪些事情呢?这个地方呢,我最好给大家呢,哎,简单的换个图,更加详细的进行这样一个说明啊,更加详细的进行一个说明好了,说明什么东西呢?大家仔细来看其, 其实当代码这个地方往下走的时候,我这样创建了 a 变量,一个 b 变量,也就是说我在内存这创建了一块空间,这一块空间我给他起的名字叫 a 啊,又创建了一块空间啊,叫 b 啊,这是我的 a 啊,大家注意,这是我的 b, a 里面放的是几呢?最开始是零, b 里面也放了个零啊, a 这块空间的地址是谁呢?就是刚刚这个地址,大家注意, a 的地址就是他,我们这地方可以把他的拷贝一份过来。我给的 a 的地址啊,就是他 啊, a 的地址就是它,就是这一块内存的编号,那 b 的地址呢?就是它了, 看到了吗?同志们啊,当我们创建好之后,接下来我们说 scanford 要输入值,我给 a 和 b 里面输入值,假设我 刚刚这竖了一个十,空空二尺,那我就会把十放到这,我把二十放到这里头来,当放好之后,我要调 a、 d、 d 函数,我上去调用。同志们,那这个是我上去调的 a、 d、 d 函数,那这个调的过程中,我是不是要为 x、 y 创建空间?那这个时候同学们注意, x 有自己的空间, y 是不是也有自己的空间?我们这条换一个颜色, x 有自己的空间, y 是不是也有自己的空间? x 里面接收的是谁呢?大家注意,这是我的 x, 这是我的 y, x 接收它是 a 的值,所以这儿得到了十。 y 接收的是 b 的值,所以这儿得到二十。而 x 的地值是谁呢?就是它, 不是吧?啊,这是 x 的地址, y 的地址是谁呢?就是它啊,而在这个地方呢,注意,我们紧接着相当于穿着一个 z 变量啊,假设这是我的 z, 我们在 换一种颜色啊, z, 那这个时候我在这地方创建了一个 z 变量, z 呢?啊,里边放的是 x, y 相加的,结果三十放在这,对不对啊?那算好的结果呢?通过 return 再把它带回来,放到我的 r 里边去,最后我们打印 r 就是三十 整过,过程中大家有没有发现?哦,那原来是这样子的,我在这个地方呢,为行餐哎,实餐 ab 创建空间,而当我真正传递过去的时候,行餐也有自己独立的空间,是不是?所以你想食餐和行餐之间的关系是什么呢? 啊?其实我可以说食餐有自己的空间,行餐有自己的空间,我们空间是独立的,所以行餐可以认为是食餐的一份临时靠背。大家注意啊,行餐啊,行餐, 餐是实餐的一份临时拷贝啊,为什么叫临时拷贝呢?因为我有自己独立的空间,我把我 a 拷贝一份放在这,我把 b 拷贝一份放在这,我放到另外一个空间里边去 啊,我 x y 有自己独立的空间,跟你的 a 和 b 啊,只是我接受 x 接受了 a 的值, y 接受 b 的值而已,就这么有关系, 有一个传递的关系,但是 x 合一不是同而空间, y 和 b 也不是同而空间,这个逻辑大家听懂了吧?所以大家要知道食餐和行餐之间的这种关系啊,我们通过调试是不是很好的理解了啊,所以行餐是食餐的一份临时拷贝啊,这个逻辑大家要清楚, 所以对于行参的修改,或者说对行参的使用,跟实参其实真的没有什么关系了啊,道行 函数内部的时候,跟这个 a 和 b 之间就脱离了关系啊。好,这个地方呢,就给大家讲清楚了关于函数的实餐和行餐相关的知识,当然我们这地方补充一下刚刚我举的这这个例子啊,这个函数的实餐和行餐是不是都是变整形,整形值对不对啊?都是整形值,这只是一个例子而已, 未来我们可能写的代码更加复杂一些,函数的参数可以是更加复杂的类型,可以是数组,可以是指针等等啊,其他东西。那等我们后期学习了指针相关的知识的时候,我们再进行深入的讲解, 明白意思吗?这个小节我们暂时对于函数的行餐和十三探讨到这里,大家要认识什么是十餐,什么是行餐,行餐和十餐之间的关系是什么样子的。 好,那么讲到这个地方,大家如果觉得鹏哥视频讲的哎,对大家有帮助的话,大家可以给鹏哥的视频的点个小红心,也可以在评论区留言跟鹏哥进行探讨。好,那这个视频我们在这讲到这里,下个视频我们再见。



好, ok, 我们接着上节课啊,我们上节课是讲了一下我们四月中的啊,啥来着?我们的一个函数的一个定义,对吧? 那么讲完我们那个函数的定义呢?我们在之前的课程有提到过,就是我们一个行三和十三,所以我们这节课来具体来讲一下我们什么是行三和什么是十三。好,那对应的一个课件啊,这里要说一下,因为有的同学可能第一次来听课。好,我们可以百度搜一下我们一个体育课学习网, 搜完之后我们可以找到这个网站,找到之后我们打开,那么在这里有一个学习资料,资料里面有个分享啊,有个分享, 在这里资料分享,我们再找到我们一个类别啊,这里选择我们一个私语言,学完之后,这就是我们每节课的一个教案,可以在线看,也可以直接去下载好对应的一个视频教程,也是在学习资料。每个视频教程, 那么这里面有个思源的一个入门教程,我们点开,这就是我们每节课啊,每节的一个课程,那么也已经排好序了,可以直接去看。 ok, 好,那我们来讲一下我们什么是行餐,什么是我们的一个时餐,行餐的话也叫我们那个形式参数,那么在我们函数定义中出现的一个参数呢?可以看作是一个站位符,他没有数据啊,就像我们这里是不是定了一个 哦,这里还要返回一下,那我们就看上节课的一个教案吧,你看像这里,我们这里定一个函数,是吧?那么里面有两个参数,但是这里的话是叫行参, 行测的话,他其实现在默认的就是一个站位符,因为他没有具体的个具体一个值,只有当你调用他这个函数的时候,传入进来的值的时候,他才能 有值啊,所以说我们函数被掉的时候,接收啊,接收传进传递进来的一个数据呢,他才有数据啊,所以这种的话是叫做形式参数,也叫我们的一个行仓啊,行仓, 你只要记住行仓的话都是啊,他只有被调动的时候呢,才能拿到值,就是需要在外面啊,传入值进来,那么他才有我们一个啊具体的一个值。那么实仓的话就是我们那个实际的一个参数, 实际参数呢,就是我们函数被掉落时给出的参数,包含了实实在在的一个数据,会被函数内部的代码使用,所以称为我们的一个实际参数,也简称为我们那个时仓。 好,我们来可以看一下啊,我们行仓和实仓呢,它的功能都是传奇,数据发生,函数调动的时候,我们实 参的值会传给我们的一个行仓。好,这里可以看一个例子,你像这种啊,我们这里调用了一个萨姆的一个函数,那么我们传进去的是 begin 和 name, begin 和 end, 那么这两个的话就是我们的一个时仓,因为你可以发现这里是不是有 他的一个实实实在的一个数据在这里,是吧?是不是有个实实在在的数据在这里?好,他把这个数据传进去啊,传进去,然后这里的一个行仓呢,他就一一对应啊,给他接收进来了,那么他们俩 m 和 n 他就会有值的啊,就这个意思。 好,那么行仓和实仓他的一个区别和理一下,我们可以看一下我们行仓变量,他只有在函数被调的时候呢,才会分配我们一个内存啊,调用结束之后会立即释放我们的内存,所以行仓变量只有在函数内部 有效,不能在函数外部使用,也就是说在函数内部改变的他的值只对当前函数内部有效啊,这个的话我们可以看一下啊,像这个他这里啊,只有调用的时候他才会有值,那么 像这个时候他只是进行一个定义啊,他并没有存储我们具体的值,所以我们需要调的时候呢,才会分配我们一个内存啊,才会分配我们内存。 好,我们时餐可以是常量变量、表达式函数啊,都是可以的,无论时餐是什么类型,在函数调用时,他们都必须有确定的一个值, 以便把这些值呢传递给行仓。也就说我们在调用函数的时候,我们传递的这些值啊,是必须要有的啊,必须要实实在在有的,不然你掉着也没意, 所以说你调用他们的时候是必须有确定的值,以便把这些值可以传给我们这个行仓。好,那仓十三和行仓呢?他在数量上、类型上,顺序上是必须严格一致,否则会发生类型管理,嗯, 否则会发生我们那个类型不匹配的一个错误。当然如果能够自动类型转换或者进行了强制类型转换,那么实餐的类型也可以不同于我们那个型餐类型,那么这里的数量上,类型类型上,我们的顺序上是必须严格一致。什么意思啊?就像这里, 我们明明这个萨姆这个函数他是有两个形象的,那么你传入进来的时候也必须要有两个啊,必须要有两个,还有的话就是我们这里明明 是两个行仓,是吧?我要接收两个数据,你也必须要传入两个数据,你不能传一个啊,之前的课程我已经演示过了,你传一个的时候他是会有问题的。好吧, 那么这里啊,函数调用中发生的数据传递,他是单向的,只能把时仓的值传给我们这个行仓,而不能把行仓的值反反向的传给我们这个时仓,所以行仓的值发生改变并不会影响我们时仓的值。好,我们来看个例子, 这里的话是计算啊,两个数之和。看这个啊,这里定定了一个函数叫萨姆,那我们来分析一下这个萨姆这个函数是否是有参函数,是不是有的啊?我们这个括号里面是不是有有参函数,所以我们这个萨姆是有参函数。 好,它的一个返回值类型是不是叫 int 类型,所以我们这个函数是有返回值的啊?是有返回值的,所以它会有 return 啊,有 return。 好,那我们再来看它有一个 int 类型的 a 和 int 类型的 b 啊,那么我们 是需要在调的时候呢,他们俩才会有值,因为现在我们可以发现他根本就没有值,因为我们也不知道他是什么,是吧?所以当这个魅方法啊,魅方法这里面是不是在这里调用的?就是我们那个调用我们的萨姆这个函数,那么调用的时候我们是不是也给了 a 和 b, 当然这个 a 和 b 是由我们用户进行输入的,这个应该都看得懂了,因为全部都讲过了。 scanford 嘛,是吧?百分号 d 输入我们的一个实际日数,再打一个百分之二 d 演示输入我们的一个实际日数,输完之后给他变量 a 和变量 b, 所以我们比如说我们这里输入的,是啊,比如说十,然后二十。好,输完之后我们 aa 的值就是十, b 的值就是二十,所以我们调用三亩的时候呢,其实就是这样子啊,三亩,然后呢十二十,好, 那这样的话我们会把十和二十传递给这个函数,那么就到了这里,到这里的时候我们 a 就会接收这一个啊,就是说 aba 这个行仓啊,他是第一个,所以他也会接收这里的第一个。好,那这里 b 他就会接接受第二个,所以说这里形成 a, 他就是十, b 就是二十毫 a 和二十的时候,我们可以发现这里有一个计算啊,有个计算,那就是这里其实就 a 等于 a 加 b 嘛, 这个都看懂了啊,你看 a 加等于 b, 我们之前的客人讲过啊,他其实就是等于 a 等于 a 加 b, 那么我们来算一下啊, 我们知道 a 他是几,他传递进来是不是十,所以这里就是十,好,十,再加上我们那个 bb 的话,他传进来是二十,对吧?所以这里就是十加二十等于多少 等于三十。好,最后 a 的值他就是三十啊,他就是三十,那么这里 pront 打印出来呢,其实这里就是三十啊,就是我们的 a 等于三十啊,打印出来结果好, a 等于三十,之后 我们在 return 啊, return a, 那么这个时候我们这个 total 这个呃变量呢?它就是三十的啊,这里就是三十的,也就是我们这个 total 呢,它是等于三十的啊,等于三十,那这的话我们就是 a 等于我们的一 个多少等于十,然后我们 b 等于二十,但是有的同学说,哎,我这里把 a 是不是传过去的,是吧?我 a 本来是十吗?我传过来,传过来,这里也有个变量叫 a 也接受了,然后 a 呢?这里呢等于三十的,那返回来 a, 我是不是这个, 这边这个 a 他也应该是三十,哎,这就有点问题了,是吧?所以说我,我现在这里告诉你们,这个 a 是等于十啊,他为什么等于十?我们来运行看一下,是吧?我们看一下实际的效果,看我说的对不对啊,我们来试一下,然后再给你们解释一下啊,我们变异链接 好,呃,这里有个问题啊,我们直接可以点这个双击一下 pract 哦,这里看到没?这里这个封号啊,是一个英文模式的封号, 所以我们要用我们的一个呃,英文模式的封号。好,现在改一下,我们再点编一链接。好,这没问题的,你们可以看到啊,我解决问题的话是怎么去解决的?然后快速的定位,那么你们就可以学一下了,是吧?这里搞好漂,搞漂亮一点啊。好, ok, 我们点编一链接, 然后点执行。好,我们来输一个,两个整数啊,我们输一个十,再打个空格空格,然后二十,然后一回车。哎,可以发现他最终输出来 a 确实等于三十啊,这个三十的话是这里的啊,我们把它 写个刚,也给他换一行,我们重新运行一下,编一链接执行,然后十空格二十,这空十空格二十,这个就不用讲了,我们之前讲 stanford 时候已经讲过了啊,已经讲过了,回正好可以发现,首先我们输完之后啊,就是这里啊,这里输完之后,我们输了一个十和二十嘛,那么 a 就是十, b 就是二十,那么他调用了一个 same, 好,调用完之后他这里进行加减乘除啊,搞完,搞完之后直接 print, 直接输出了一个 a, 那么 a 就等于三十的啊,因为经过这里计算, a 就是三十,然后他要把这个 a 的值要入坑了啊,入坑了, 那么 return 之后,我们这个拖头呢,拖头就是他 return 出来的这个值,他就是三十,所以啊,这里我们 plant 拖头呢,他应该是等于三十,这里没毛病,但是我们发现这里啊,输出 a 的这个变量 a 的值呢,他怎么还是十啊,你看怎么还是十,不是三 三十的吗?好,这里告诉你,我们传递进去的是食餐啊,食餐 a, 那么食餐呢,是不可能被我们行餐改变的啊,不可能改变的 啊,我们传进去的时餐呢,只是给他负了值啊,负了值,就是像这里,我们只是把 a 和 b 的值给到这里的 a 和 b, 并不会啊,直接把我们 变量 a 和变量 b 直接替换掉了啊,就不会的啊,他只是给他负了值,那么这个变量的一个内存地址和这个内存地址是不一样的,知道吧? 其实你们也可以打印出来看一下啊,打印出来看一下,好,那这里的话就是应对着我们这里的话在哪里去了,就是我们的一个行参的值发生改变了呢,我们十 三是不会改变的啊,十三是不会改变的,也就相当于这里你虽然传进去十,对吧,然后这里呢也确实接受了他,然后改变了啊,改成三十了,但是呢,我们十三是不会变的啊,这个一定要记住,我们十三的是是不会变的 啊,我们形成的值是是多少就出多少,他不会进行改变的。好, ok 哦,这里还还有一个结果图,截一下图, 把它截张图,你们也可以把这个代码进行敲一遍啊啊,虽然我们的一个加号里面好像是直接可以粘贴的吧。 好,所以这节课的话就主要是要注意我们十餐啊,我们十餐就是我们实际的参数,他呢 就是我们啊钓鱼函数的时候传入进去的值,那么行仓的话是我们函数接收的值啊,那么行仓和十仓,行仓是不能啊,改变我们十仓的,我们十仓呢,其实就是把十仓的一个具体的值呢复制给了行仓,然后行仓再进行一下操作, 他操作完成之后,他的内存呢就已经释放掉了,就像这里我们调用了萨姆,对吧?我们调用完啊,调用完成之后,这个 a 和 b 他是直接被释放掉了啊,被释放掉了,所以也就说到了这里这一步的时候, 这个 a 和 b 呢,他又释放掉了,也就说他就不存在什么十和二十了啊,因为已经调用完成了,好吧,应该从调到这里啊,到这里他就调用完成了。好, ok, 那我们这 这节课的话就讲到这里,主要是我们要啊知道他是什么意思,就是行三和十三,到时候问你的话,你要知道,然后呢?他们俩的一个关联,关联关系和我们的一个区别,这个的话也是要自己去记一下的。然后把我们这个 案例啊,自己去敲一遍,然后试一下,看看是不是这种情况。就是比如我这个币呢?这个币我要去改一改,是吧?这里会不会币呢?是吧?我们可以去实验一下啊,去实际实验一下。好, ok, 那我们这节课先讲到这里,我们下节课再见。


大家好,我们在这一小节里学习 c 语言中函数的函数调用过程,函数的返回,被调用函数的声明和函数的原型。 这个例子呢,我们已经看过了啊,也就是说输入两个整数,要求输出其中这个值较大的,输出这两个当中比较以后大的那个要求用函数来找到大数。 那在这里头我们看 include 呃,这个 s t d i o 这是一个标准的输入输出函数。这个呢,是包含把这个标准的输出头函数包含进来。这是 c 语言当中的预处理预处理 命令。嗯,在这里头。 ant 这组函数在主函数里头。这个从这划括号啊,这个划括号。这个是。呃,函数题啊。在函数题里头第一个 啊。 ant max antx anty 这是对 max 这个函数的声明。 max 这个函数是用户,用户自己定义的。这个函数在这了啊。 在这里头有三个变量。 a b c 定义为整形变量。输出一个 print into two。 呃, inter number 就是提示输入数据。 那 s c a n f 这是一个输入函数。输入函数呢,输两个整数,这个是输完两个整数。这是一个函数。调用 c, 把这个 max, ab 这两个是时餐啊,这两个是时餐。把这两个时餐调到。呃,就是 在这个 in ant max ant x ant y 这个呢,就是呃用户的一个定义的函数。调用这函数返回的值就是这两个。通过调用这个函数返回那个值,就是一个大的。 那个大的值送到 c, 然后呃,输出这个大数 c, 然后返回这里头。 i n t max x y 这个呢,就是这个定义的函数。这两个在这里头。这两个是时餐,然后定义临时变量 z。 在这里头是一个。 这个条件表达是 x 大于 y。 如果这个条件成立,那 x 值复制给 z。 如果这个条件不成立, x 小于 y, 那把 y 复制给 z。 那这个呢?就是把 x 和 y 中大的那个数复制给 y z, 然后返回时这个函数的返回值。是把这作为 max 函数的值带回到主函数当中 啊。这个就是我们呃定义函数名为这个 max。 它的这个类型。函数的类型是整形,然后 指定了两个型参 x, y。 型参的类型是整形。组函数包括了一个 函数调用 max, 就这个 max。 max 后面的发货号当中的这个 a 和 b 是时餐, a 和 b 两个函数之间啊。 a 和 b 在 max 函中定义的是变量。在 x 和 y。 这个函数是函数 max 的形式参数。那通过函数调用在两个函数之间呢? 这发生数据传递实餐的 a 和 b 的值传给了行餐 x 和 y。 在这个 max 这个函数中,把 x y 最大的这个数复制给变量 z z 的返回 值啊。这个值作为函数值返回到组函数复值给 c。 那我们看这就是他的呃示意啊。组函数当中的 c 把这个 maxa 和 b 这俩是时餐复值给 c, 这是组函数的返回值啊。 在这个呃 max 函数当中,这个 x 和 y 是行参,这个时参带到行参这个位置,然后在这个函数当中 进行求解。求解出来的那个大的那个值啊。返回的这个是这两点大的值,再返回到组函数 c。 这种在调用函数过程中发生的时餐与行餐间的数据传递,我们称 之为虚实结合。好,通过这个例子,我们看一下函数调用的过程。在定义函数中,指定的行参 在未出现函数调用时,他们并不占内存中的存储单元。在发生函数调用时,函数的行参才被临时分配内存单元。 第二点,将实餐的值传递给对应的行餐。第三点,在执行函数期间, 由于行餐已经有值,就可以利用行餐进行有关的运算。第四点,通过 r e t o r n return 这个语句,将函数值带回到主调函数。应当注意返回值的类型与函数类型一致。如果函数不需要返回值,则不需要 return 语句。 这时函数的类型应定义为这个 wide。 wide 就是呃,无返回参数啊,也叫空类型。 第五点,调用结束,行餐单元被释放。注意食餐单元应保留并维持原值没有改变。如果在执行一个被调用函数 时,行餐的值发生改变,不会改变主调函数的食餐的值,因为食餐与行餐是两个不同的存储单元。 注意食餐像行餐的数据传递是直传递, 单向传递,只能由食餐传递给行餐,而不能由行餐传给食餐。 实餐和行餐在内存中占有不同的存储单元,实餐无法得到行餐的值。下面我们看一下函数的 返回值。通过函数调用,使组函数组调函数能得到一个确定的值,这个值就是函数值,我们也把它叫做函数的返回值。 在这里需要注意两点。第一点,函数的返回值是通过函数中的 return 这个语句获得的。 一个函数中可以有一个以上的 return 语句,执行到哪一个 return 语句,哪一个 return 语句就起作用? return 语句后面的括号可以不要,比如 return z 与 return 有括号的 z, 这两个是等价的。 return 后边的值可以是一个表达式。第二点,函数值的类型。 函数值的类型在定义函数时指定。比如我们看这个 max f l o a g float x float y, 这个就是定义的这个函数行参的函数的类型。 x 是一个实行 y, 也是实行函数值的类型。在这 max 前面有一个 ant, 那就是整形。 那第二个 later 括号里头型参 c。 一、它定义的是字符型,型参 c。 二,定义的也是一个字符型。整个这个 函数值的类型。前面 c h a r, 那这个定义的就是字符型。 再看下面一个,这是 m i n man, 应该是小啊,求小的。那它的型参的 x 定义的是整形, 这个行参的 y 定义的是整形。而整个这个 m i n 这个函数的值定义为 double, 是 double, 是双精度型。 第三点,在定义函数时,指定的函数类型一般应该和 return 语句中的表达式的类型是一致的。就是我们 定义函数式的类型要和 return 表达式类型应该是一致的。如果函数值的类型和 return 语句中表达式的值不一致, 则以函数类型为准。对数值型数据可以自动进行类型转换,即函数类型决定返回值的类型。 第四点,对于不带不带回直的函数,应该定义这个函数为 y 的类型。我们把这个叫做空类型。 这样系统就保证不使函数带回任何值,即禁止在调用 函数中使用被调用函数的返回值。此时的函数体中不得出现 return 语句。这个是如果定义成 y 这空类型的时候,它是不带回返回值的。 下面我们看这个例子啊。这个例子是对刚才上一个例子啊,七点二例子做了一下改动, 把这个 max 函数中的定义啊变量 z 改为这个 float 改为实行。 那么函数返回值的类型与指定类型指定函数的类型不同。我们看分析一下他的处理方法。 这个 include s, t, d, i, o 这是头文件啊,标准的输入输出头文件包含进来。然后这个是 c 元的预处理预居啊。 nt main 这是一个组函数,它的反类型应该是整形 nt 啊。 这个这个是函数的声明啊。 and max 这个 x, y 这号的定义的他行餐是实行,然后他返回只是个整形。在这里定义这个 a 和 b 两个实行变量, c 是整形变量。那输入两个 数到 a 和 b 啊,应该是实行的啊。下面是调用这个 max 这个函数,调用这个函数呢。这个 a 和 ba 和 b 在这里头定义的是实行啊。送到 c, 然后输出一个 这个 max 是这个 c 的值返回,这是主函数的返回。下面是这个最大值,求最大求这两个啊。 xy 是实行参定义的实数啊,这返回值是整形。 然后嗯,这个 z 也是实行变量。如果 x 大于 y 大于它是 x 值小于它是这个返回 z 啊。那我们这这里 里头看一下 max 函数的行餐,嗯,是指的 float, 指的是这个实行实餐也是在这个实餐。实餐里头, a 和 b 给的也是实行。 在组函数中输入给 a 和 b 的值,我们给他输了一个一点五和二点六。那在调用这个 max 函数时,把这个 a 和 b 的值的一点五和二点六传递给这个行参 x 和 y 执行这个函数 max 中的条件表达是就这个 z 把 x 大于 y, 问号 x, 然后冒号 y, 这个求得的结果复值给 z 啊,使得这个变量 z 得到的这个值为二点六啊,这返回值是二点六那。 呃,现在出现了矛盾,因为你这函数上面定义的是整形,而你 return 语句中的 return 语句中的 z 啊,是实形, 要把这个 g 的值作为函数的返回值,那这个就出现了。你这个函数定义的是整形,但是你这对称的这个是实形,那这两个就不一样了。如果将 man 函数中的 c 改为实行啊,这个 c 改为实行啊, 这个啊,怎么处理?按负值规则处理,先将 z 的值啊转换成整形啊,转换成整形得到这个二。现在是啊,将 z 这个值改为整形,得到是二,那这时他就是函数得到的返回值。 如果把这个慢这个函数这号定义的 c 是整形啊,这号也改为实形啊。用这个用这个百 号 f 格式输出,输出是二点,后边四个零实行。 因为调用麦克函数得到的是整形函数值,还是为整数二。所以说就是在定义的时候,这个函数的返这个函数的这个类型和你这个返回值的类型一定要 类型要一致啊,一定要一致,不一致呢,就是出现这样的。呃,给人就是容易出现错误。 好,下面看一下对被掉函数的声明和函数的原型。在一个函数中 调用另一个函数,即被调用函数,需要具备如下的条件。第一个条件就是被调用的函数必须是已经定义的函数。 如果是库函数或者用户自己定义的函数啊。这里头可以是库函数,也可以是用户自己定义的函数。 如果使用库函数,应该在本文件开头用。 include 这是包含的那个命令啊,这个指令对调用有关库函数时所需要用到的信息包含到本文件中。 如果使用是自己用户自己定义的函数,那么这个函数的位置 在调用它的函数,即主调函数的后面。在同一个文件中,应该在主调函数中对被调用的函数做声明啊。 declaration 声明的作用就是把函数名、函数参数的个数和 参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确啊识别函数并检查调用是否合法。 我们看一个例子啊。这个例子呢,就是输入两个实数,用一个 函数求出他们之和。那第一个 include s, t d, i, o。 这个呢?就是标准的输入输出函数包含进来啊,也就是 c 元预处理的 这个这个语句。主函数啊。 ant m a n 这主函数啊,到这哈主函数是到这,那他是数两个实数啊。完成加的操作,那他这个 调用 add 加,这是一个加,那 x 两个型残 x, y 都定义的是实数啊。然后整个这个函数定义的也是类型,也是 实性。对 add 函数做声明啊,这是对 add 函数做声明。下面三个变量是实数的变量啊,类型是实数。然后输入两个数, 输入这两个数以后给到 a, 输入两个实数,然后这个是调用啊。 addab 在这里头 a, d, d, a, b 加得的结果,那个和复制给 c, 然后再输出这个 c, 那这个 a 和这个 b 就是时残。 那这调用以后呢,就调用到这啊,再替换呢。这个 float a, d, d 这个行参的位置,然后给一个变量 z 啊, 是定义的是实餐,嗯,就是实实数啊。然后 x 加 y 就是你。这还要调就是 a 加 b 的值,复值给 z, 然后返回值,返回的 z, 那这个 z 也是实行啊。他这个函数的类型是实行,那就是把变量 g 的值作为函数值返回啊。返回到这算出来他们的和,算他们的和。以后呢,那输出这两数之和。 那在这里头,函数的声明和函数的定义中的第一行就函数的首部啊。函数的声明和函数定义就是我们这个红的,这个和这个红的是一样的啊,一样的只差一个分号啊。在组函数里, 这个是一个分号啊。函数声明这是个分号声明,比函数定义中的首行多一个分号。 函数的首行记函数的首部称为函数圆形。就现在在这个函数的首行,这个称为函数的圆形。 因为在函数的首部包含了检查调用函数是否合法的基本信息。那这个包括函数名,在这里的函数名就是 add 啊,函数值的这个类型,函数值的类型就是这个 f, l, o, t 是是个实行参数个数。在这里的是两个参数啊。参数类型这个参数 x, y。 参数类型是实行因。 因此在函数调用时,检查函数原型是否与函数声明一致,这样就能保证函数的正确调用。 也就说在组函数的这个函数的声明和在你这个函数啊,这个是函数的定义,这个之间就差一个分号啊,就差一个分号,这是一个。另外一个呢。他在你这个对函数 呃声明的时候,就检查你这个定义这个函数的时候是否符合啊。编译 嗯,检查的那些个基本信息啊。这就是嗯。函数的对调被调用函数声明和函数圆形的 的这个区别与联系。下面对被调用函数的声明和函数原型啊。这个前头这个你看函数类型函数名参数类型一参数名 参数类型二参数名。以此类推。然后或者是函数类型函数名参数类型一参数类型二参数类型三在函数声明中的行参名啊,可以省略而只写行参的类型。 比如说这个 float, 这就是加法啊。 a d d 这个定义的 x y, 这是行参。这个行参呢,就是定义的是实行行参。 x 定义的实行行参, y 定义的 是实行。第二个。嗯,整个这个函数的类型是实行啊。第二个没写行参啊,没写行这个没写这个行参的参数名啊,只写了参数的类型。 第三个啊,参数名没用 x, y, 而用的 a 和 b, 这个也是可以的啊。 那我们看一下这个第一个呃,这是定义的字符形啊。 later 是字字母就是这是一个呃 定义的字符型的一个参数啊,它的型餐是这两个,其实是两个型餐。两个型餐以后 他呃,如果有分号啊,如果有分号,所有函数之前,切在函数外部进行函数声明啊,这个都是有分号。那就是依据了那组函数中,在 这个 n t m a i n 组函数哎,划括号啊。在组函数中调用 later、 f 和 i 的函数,就不必再对这三个函数进行声明啊。 这个呢,就说如果你在文件的开头,在所有函数之前,你对本文件中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再次声明。在我们前面 讲的例子当中,都是在组函数里头先对被调用函数进行声明,声明完了以后,在他的这个组函数题里头再调用被调用函数,那就得必须得先声明。像这种情况是,在 还就是所有函数之前,切在函数外部进行这个函数声明。先一开始把这个所有的函数都声明完了,那这时候在总函数里就可以不用函数声明了。 对函数的定义和声明不是同一回事。函数的定义是指对函数功能的确定,包括指定函数名、函数值、类型、型餐以及类型 啊、行参以及这个行参的类型以及函数题等。它是一个完整的独立的函数的单位。 而函数的声明的作用则是把函数的名字、函数类型以及行参的类型、个数和顺序通知编译系统,以便在调用该函数时,系统按照 按照这个声明的那个进行对照检查他不包含不包含函数体。那这就是被调用函数的声明 和函数原型。就说函数声明和这个定义的就是不是一回事啊。好,在这一小节里头,我们 对函数调用的过程,函数的返回值以及被调用函数的声明和函数原型、声明和定义之间的区别啊进行了了解和学习。好了,这一小节我们就到这。

今日话题,虽语言中石身和行身的直传递,一直都不理解为啥行身不能传旨给石身呢? 在开始前,我有一些资料是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份私语言,从专业入门到高级教程加工具包,点个关注,全部无偿共享给大家。在评论区回复八八八,关注我之后,私信回复八八八 即可拿走。此处 a 和 b 是行参,它代表的是是函数所用的参数的形式。五和七是十参及实际参数 就是你执行艾特这个函数时真正使用的参数。行参就是函数为要传入的纸准备的一个外壳,而时身就是最后传入行身,也就是塞进那个壳里的实际的纸。在函数内,你可以使用外壳访问 内的值,函数挨着接收的行餐值五和七在函数内部可以根据某些业务规则,此处是加法运算,对五和七进行任何数据处理,然后返回处理后的结果及函数返回值。 resolve 是一个局部变量,不是时餐,他就是接收碍函数的返回值。 也就是说, result 为了获取到某种功能效果,必须调用某函数的功能才能达到。被调用的函数通过入身并处理这些数据,使得该函数完成这个功能后并返回结果给 result, 而 result 单独是无法接收和处理这些数据的。

来看一个函数的参数,函数的参数呢?我们之前涉及到的都是按值 来传递参数,也就是说把一个变量来作为我们的行参,一个普通的变量作为我们的行参哈,比如说这个地方,我的这个第一个参数是一个整形的变量,第二个参数 是一个整形的变量,是不是一个普通的变量?好,然后接下来我在这里调用了哈,那我调用的时候呢?是不是要做一件事情啊?什么事情啊? 传递参数对吗?啊?把这个 a 的十呢传递给 x, 把这个 b 的一百呢传递给外,把它放进来哈,放进来,然后 接下来再进行这个代码代码的执行哈,先执行这个,再执行这个,再执行这个,再执行这个。怎么执行啊?先执行这一句,我们说他是交换这个 x 和 y 的值吗?哦,先执行探泡等于 x, 那么这个时候 tom 等于 x, 是不是就把 x 的十放到 tm 当中了?好,再执行 x 等于 y, 这个时候呢,我就会把这个 y 当中的一百放到 x 当中,然后再执行 y 等于 apple。 好,这个时候我就会把这个 top 的十放到外当中。我是不是成功的交换了 x 和 y 的值呢?是不是成功的交换了 x 和 y 的值?但是我问同学问一下, a 和 b 的值变化了没有? a 和 b 的值有变吗?有没有变?有没有?同学们,我们说这个题 的本意肯定是想交换 a 和 b 的值哈,他希望我执行完了以后,这个 a 变成一百, b 变成十哈,但是我执行完了以后, a 和 b 的值变了没?对, 没有变哈,没有变,我们看到这个完全没有变啊,所以他这个程序不能,不能实现我们想要的那个结果。那我问同学们一下,有同学会说,那我 a 和 b 的值没有变,那怎么办呢?我明明都把 x 和 y 的值 那个变完了呀,难道我是需要这个蕊特?好,我是不是需要蕊特一下啊?因为我的这个函数就是要用来教 两个数的吗?那交换完以后的结果是不是要蕊蹭一下?好,所以我这个地方就不应该 wory 的 wy 的是没有没有返回值的哈,你看 nt 一下,然后我要蕊蹭哦,我是不是可以蕊蹭两个?我能不能蕊蹭两个值啊?同学们,可以吗?不可以,同学们, 一个函数只能对称一个指,这点一定要记得哈,比如说你这个地方如果还有一个 c 哈,比如说你这边还定义了一个 c, 那么我 c 等于 斯外。好,他这个地方哈,我蕊特回来的值是要代替这个函数的,比如说你蕊特二,那 c 就等于二吗? 那你捋成两个直又是什么东西?我到底应该把 x 给 c 呢?还是把 y 给 c 呢?所以我不能捋成两个,我只能蕊成一个哈,那现在怎么办?我交换了两个变量的纸, 我最后只蕊特一个,那我要怎么整呢?好,所以说这没有办法是不是?所以我们呢,按直传递哈,他只能蕊特回一个值哈,这有的时候是一种限制,就是因为有很多情况下,我们可能需要返回一整个的数组,里面的数据都要变, 或者是返回好几个,就是你需要需要这个被调函数,跟我的主调函数可能需要交流, 交流好多的那个数据哈,那当然了,你这个主调函数传递参数可以传递好多个, 但是返回值却只能返回一个哈,但有的时候我是需要被调函数,还要给主调函数反馈好多个数据哈,怎么办啊?所以这个时候呢,就有了我们的第二种啊,按 地址来传递参数,我们看一下这个例子哈,你们看这个十外婆这个函数,他的这两个参数呢?不是普通的参数,他是什么参数啊?他是一个整形的指针 x, 整形的指针外,所以他是两个地址,对不对啊?他是两个地址哈,那这个时候 后呢,我具体是怎么样操作的呢?好,首先要看好如果你这个呃行餐是什么类型,我的食餐是不是要一样的类型啊? 我们说过了哈,食餐和行餐要一一对应,并且呢类型一致,对不对?好,食餐有几个,我行餐也要有几个,并且类型要一样哈,就是第一个的类型,第一个食餐的类型要跟第一个行餐的 类型一样,第二个时差的类型要跟第二个型差的类型一样,对不对?所以呢,由于我这里呢是指针 x, 所以我这边只能传递地址, 你不能传递 a 哈,还会记得我们上次做了好多那个选择题,你不能把一个变量付给一个指针,是不是?只能把变量的地址付给指针哈,这要记得哈,变量的地址, 所以这样饮用,而这样调用才是正确的。那我们来看一下它具体是怎么样调用的哈。好,这个例子 当我调用的时候,是不是要先传递参数啊?所以呢,在我的这个被调函数里面,他的这个 x 这个指针当中放的就是 a 的地址了, y 的这个指针当中放的就是 b 的地址了,是不是他传递参数相当于是 x 等于 n 的 a, y 等于 n 的 b, 对吗?好,然后那我们既然 x 等于 n 的 a, 我们就可以说 x 指向 a 了,对吗?是不是可以说 x 指向 a 好了, x 等于 n 的 b, 呃, y 等于 n 的 b 哈, y 就指向 b, 然后接下来,接下来呢,我传递完参数以后呢,要开始执行了哈,我先执行这条, sumple 等于新号 xcemple 等于 信号 x, 太阳谱在这里啊,他的空间在这个地方,然后星号 x 是什么呢?我们说 x 指向 a, 那么星号 x 就是把他的指指向的那个指取出来,也就是 a, 对不对?好,所以星号 x 就是 a 哈,所以 tame 等于新号 x, 就是把十放进 apple 当中,就是 tom 等于 a 了,可以看成 typle 等于 a, 对不对?然后下一句, 星号 x 等于星号外,那我们说外指向 b, 对吗?所以星号外是不是就是 b 啊?好,于是呢,我星号 x 等于星号外,事实上呢,就是把这个 b 当中的一百呢放到 a 当中,对不对? 好,所以 a 就变成一百了哈,那接下来下一句,星号外等于太棒。好,星号外是不是相当于是 b 呀? 等于太婆,所以我这个时候是不是把这个太婆当中的十呢放到 b 当中?好,你们看我有没有完美的实现了 a 和 b 的交换,有没有?好,所以说如果你按直进行传呃, 按地址进行传递的话呢?我这个被调函数运行过程中呢,就可以去改变我的这个主调函数里面的这两个参数变量,对不对?如果传递三个,你如果传递三个参数过来,我就可以 通过这个被调函数来改变这边的三个的,这边这这三个变量的的那个值,对吗?只要你传递的是地址哈,因为我就可以通过这样的新号 x 来 访问到这个 a, 通过这样的星号外来访问到这个 b 就可以改变他了,对吗?所以如果呢?那个被调函数需要说返回很多只给主调函数的话,我们就可以考虑说用这个按地址来传递参数,对不对啊?这个是我们今天讲的哈,参数 有两种的传递方式,按值和按地址。

好,那这一刻讲这个函数行餐和食餐数量不匹配的时候, 那就是咱们其实有三种情况。第一种是就是你十餐十餐的个数等于剩餐的个数,是吧?这样的话是输出一个正确结果的, 就像这种是吧?你这边有三个型餐,下面你吊用的时候给他吊用三个食餐,是吧?他是输出正规结果的,那假如说你食餐的个数多一型餐的个数,对吧? 那也就说假如说你行三有三个,但是你掉的时候是给他传了四个参数,是吧?那这样的话,你看他只取到行三个手,所以说他这边只会传给他三个,对吧?所以你这边打印只会打印三个,那假如说十三个数小于行三个手,对吧? 实现的歌手就是说假如你行三 行,他这边有三个,是吧?但是你十三只给他穿两个,那是不是少一个是吧?少一个怎么办?他就会少一个的话,他就会答应一个安迪范的,对吧?就是说行的定义为安迪范的,所以说结果为 n n, 是吧? 好,就是这么一个情况。嗯,我们可以举个例子,是吧?哎,把这三个咱们先理解他的定义理好之后,咱们可以做一个例子,是吧?你看大家说,你看你这边是不是有,你看这边是不是有三个,对吧?有三个参数是吧?好, 有三个参数之后有三个行,但那我现在得传了,是吧?你注意看我传的 时候我怎么穿的。我首先是啥?首先是我给他穿两个,那也就是说这是哪种情况?是不是你这边给他穿了 两个十三,但是你行三有,行三有几个?有三个是吧?属于哪种?这种话是不是属于咱们这个十三的个数小于行三个数,是吧?来咱们看一下他的一个啥,他的一个答案结果来看答案结果是个啥? 你看,你发现没?看他最后是安迪范的,对吧?对吧?就是对应咱们这个,是吧?就是十三个小月圣诞歌手就会答应安迪范的。那假如说你这边有三个,是吧?那我这样我干啥呢?你看 我给他传, 我给他传四个,是吧?来看我给他传四个来, 你看 就这种是啥?是不是十三属于咱们这种,是吧?就是说十三的个数多于行三个数,是吧?他,你给他传多了,是吧?是不是这样子的? 那,那假如说船多的话,那然后你看他的结果是吧?来刷新一下, 你看是不是三个,对吧?是不是三个?就最后一个他就被踢出掉了,是吧?你看就是看直取到行三的各种,是吧?他只会拿到行三的,对吧?你就十三 这个东西他是不管的,对吧?就这么个意思,是吧?好,那这就咱们当然的话,你假如说你一匹配的话,那就他就会做一个实际的答应,是吧?都是不影响的,对吧?这是正常的,对吧?你给他传三个,他有三个行三,是吧?这种是正常现象,就是正常结果就行了。好,这就咱们的三个 三种情况,是吧?你看这边他有一个小结石吧,他说函数可以带参数,也可以不带参数,是吧?这是肯定的,对吧?你可以给他传单,也可以不传单,然后身份函的时候函数名括号里的是行散,行散默认之为安迪范的,对吧?你看他这啥意思? 他说他默认之是一个安利范的, 那也就是说假如你掉的时候 你看假如说你这样再看这种,是吧?就是你这边规定三个形态,但是你十三给他一个都不传,再看他是啥情况,看是不是安定范的,对吧?就这种情况,是吧?他是安定范的,对吧?你看 然后吊用函数时候,函数名括号里的是食餐是吧?多个餐桌中间有多个分割,行餐的个数可以和食餐个数不匹配,但是结果不可预计,所以说你在写的时候你肯定你要给他一顿上,是吧? 你不能说不皮,不皮的话他会出现各种问题,对吧?会影响咱们以后的一个判断的。

大家好,欢迎大家来到潭州教育,我是潭州教育丹妮老师,今天我们来继续讲解我们的函数, 今天呢我们主要讲解的是一个行餐和一个食餐的区别。首先什么是行餐?什么是食餐?我们在以前在写一个函数的时候,比如说我们的 in fact 函数里面有一个参数,对于那一个小括号里面的,我们把它叫做行餐, 行餐呢,只是在定义这个函数的时候,而不是在使用这个函数的时候, 主调与背调函数之间呢,有一个数据的一个传递,这就是有参函数。比如说我在麦函数里面去调用一个放函数,在调用的时候我需要把一个值给放函数去使用, 等一下我会带着大家去做例子,在定义函数时呢,函数名后面括号中的变量就称为形式参数,也叫做形参。在主调函数中调用一个函数的时候,就是 在钓鱼一个函数的时候,函数名后面括号中的参数呢,我们叫做时餐。 ok, 等一下下面的一个小例子就有详细的说明啊, 我们要注意一个点,什么点?就是在发生函数调用时,调用函数把食餐拷贝一份传递给我们的那一个。呃,行餐,行餐拿到这一个食餐之后,拷贝的这一份食餐之后再去进行操作,所以 我们等一下有一个小例子让大家去做一下,我相信很多同学都会犯这样的一个错误。好,我们 先看一下下面的这一个小例子,有一个范函数,然后我们在麦函数里面我们调用了一个范函数,对吧? 首先我们定义了一个印特 y 的一个变量,他的初始值是二十,然后我们调用范函数的时候,把我们的这个初始值放进去,这是函数的一个调用方式,然后 当他执行到这一个范函数的时候,他才真正的去把 x 的值进行复制和申请。内存空间 在我们的代码没有调用,我们在这个地方加两个斜杠进行注视之后,这一个 x 他永远是没有内存空间的,这个 x 他只是一个表面上的 x, 比如说小宝贝还没有出来或者还没有出事的时候,我们把他取了一个名字,那个名字不是 是说对应的一块内存空间,而是一个虚拟的一个假的,只是人为的给我们看的一个内存空间。我们可以拿着这一个 x 这个变量去进行操作,但是 x 是不是真的存在呢?在我们没有调用之前, x 是不存在的。比如说我们的这一个 x 在内存中他是占用四个字节吗?硬塔类型在内存中是占用四个字节。三十二位集集上以前给大家讲过,而这个地方他并没有占用四个字节的内存, 这个地方只是一个名字,他根本不占用内存。只有我们当我们在调用的时候,我们调用这一个放函数的时候,我们可以看一下调用放函数的时候,把这个 y 的值放进去,这一个 y 他就是实实在在存在的。 当我们代码一直运行,运行到这个地方的时候, y 他是存在占用四个字节内存,在四个字节内存里面的值负值成二十,对吧?这就是他的一个时餐和一个形餐。好,我们可以把这个小练习练一下,然后看一下他的一个小小的效果。 好,我们创建一个温三二的一个控制台程序,大家可以跟着我一起做。首先我写了一个范函数,对吧?写了一个范函数,他的返回值是 word 类型的,说明他没有返回值,他的参数是一个应特类型的,应特的 x。 好,然后我们干了一个什么事,就是把它的值打印出来,对吧? print f 打印什么呢?把 x 的值打印出来。 hello, hello, x 等于摆放号 d, 对吧? 以前我们在讲仆人 f 的时候也讲过,然后把 x 的值打印出来,对于这一个 x 来说,他是一个行餐,对吧?如果我们不调用,他永远都是没有内存空间的。而我们在这个地方,比如说我们定一个 y 等于二十。好, 同学们可以想一下,我这个地方定义 y 等于二十的时候,我们答应的结果,这个 x 它是多少呢? 我们调用完之后,调用范函数,把这个 y 值放进去,他打印的是一个 x 的值,对吧?对不对?这个地方打印的是一个 x 的值,而我们传进去的是一个 y 的值。我们把 y 放进去,他打印的是多少呢?刚才在注意项里面给大家已经讲过,注意项里 说,我的实餐拷贝了一份给谁呢?拷贝了一份给行餐,对吧?所以说这个地方的 x 和这个地方的 y, 它都是同样的值,但是呢,它是一个拷贝本。 所谓的拷贝呢,就是我克隆了一个 x 出来, x 干事,和你 y 有关系吗? x 是不是以克隆的一个副本?我在这个地方对 x 进行任何的操作, x 加加 x 减减,你的这个 y 值不会进行改变。 好,大家如果不信的话,我们可以进行一个小小的测试,好 x 加加,好加加操作。我们也讲过了, x 加加的时候,我们打印的 x 值应该是多少,对于这个题来说,它是二十一,对吧,而现在我再把 y 的值打 出来,好,好的,同学觉得这个地方不过瘾。好,我们这个地方也改成 x, 我们看行不行?好,首先我们编一下,看我们的代码有没有错误。好吧, 好,应该是没有错误的,为什么呢?这就是涉及到下面我们要讲解的内容了。 好,这个题没有任何问题。好,这,为什么这个地方定 x, 这个地方还可以定 x 呢?在后续会给大家讲到,首先对于这样的一个 x 和这样的一个 x, 他两个不是同一个 x, 这一个 x 是这一个 x 一个拷贝本,所以我把这个地方的 x 复制成二十,然后 x 加加之后得到了 x 是二十一,而这一个 x 还是二十。 好,我们把这一个实际上的 x 等于多少,我们打印出来。 对于,对于函数里面,我们加了一个 hello x 等于,对吧?对于没有函数,没函数里面,我们直接把 x 的值打印出来,我们看一下两个结果是不是一样的呢?好,我们编译,我们运行看一下结果, 看他的值是不是真的一样呢?应该来说是不一样的,对吧?因为我们在 这一个函数里边修改了这一个 x 的值,这只是他的一个拷贝本,所以我们在后面打印的时候,这个 x 的值没有任何的改变,所以有一个特别经典的啊,在 c 语言里面有一个特别经典的一个 题,叫做什么呢?交换两个变量的值,印特 x 和印特 y, 我要把这两个变量的值进行一个交换,比如说我的印特 x 等于二十,印特 y 等于三十, 现在我调用范函数之后, x 和 y, 我要把他们两个的值进行交换。怎么交换? 第一种情况, intel temple, 我先定一个局部变量, intel temple 等于 x, x 值保存,然后 x 值等于 y 的值,然后把 y 的值等于 temper 的值, 可以接受吧,应该没有什么问题啊,等于 time 的值。好,现在是不是 x 是等于 yy 等于 x, 现在的 x 应该是多少了?现在 x 应该是三十了, 对吧?而 y 变成了二十,这个代码同学们应该都可以看得懂。好,现在我再把 x 和 y 打印出来, x 值是多少呢? x 值到底是多少呢? y 的值到底是多少?我们看一下结果。好,我们把 x 和 y 的值打印出来。 好,现在同学们可能会觉得 x 是三十, y 是二十,为什么?因为我的函数里面已经交换了两个数字,对吧?好,那到底最后的结果是不是三十和二十呢? 还是二十和三十,对吧?说明一个什么问题?说明我的函数里面的 x 和 y 只是一个拷贝本,我在函数的里边修改 x 和修改 y 的值,对于函数外部的这个 x 和 y 没有任何的影响。这就是刚才我们注意点里面所讲到的那一个知识点。 ok, 好,相信同学们都已经理解了。 好,行餐和实餐,他有一些什么特点呢?首先啊,行餐在调用前只是一个形式,不占用任何的内存空间, 这一点给大家讲过,在背调函数结束后,行餐所占存储空间被释放。好,这一句话不矛盾,他是说在调用的时候,行餐就开始占用内存空间了,在调用之前他是不占用的, 因此行餐只有在该函数内有效,所以我只可以在函数的内部去操作我的这个 x 和 y。 函数结束后,返回调用函数后,则不能再使用该变量的行餐。 ok, 好。第二点,食餐可以是常量,变量表达是函数等等,食餐可以是函数。同学们无论食餐是何等类型的,在进行函数调用的时候,他们都必须具有一定的值。 我在调用函数的时候,我直接定了一个 x, 我不给他付书值初始值,而我把它当做一个函数的一个时餐的时候,可能会出现一些意想不到的结果,所以我们在调用函数的时候都必须具有确定的值,以便把这些参数全给行餐 因子。因,首先要进行复职、输入等一些操作啊。 ok, 是食材 获得确定的一个值。好,第三点呢,实餐对行餐的数据权利是单项的,即只能把实餐的值传给行餐,而不能把行餐的值反传给实餐。 这就是刚才其实就是说他的一个拷贝,我把食餐里面的纸拷贝了一份,放到行餐里面去了。行餐做任何的操作,他都不会影响我食餐的一个结果。 所以说我时餐可以把值给行餐,而行餐不可以把值传递给时餐。如果我要把结果传递出来怎么办?可以用到返回值。 好,食餐和行餐占用不同的内存单元及同名也互不影响。刚才我们做了一个同名的,对吧? 因为他们是一个拷贝本,两个占用了不同的一个存储空间,所以我对他们进行操作,尽管名字一样,内存空间他是不一样的,所以我不会受到任何的影响。 好,刚才就讲到了一个返回值,对吧?对于一个函数啊,我如果要得到他的一个结果,对于函数的参数呢,我们可以当做一个输入来 来理解,比如说我要得到两个数的值,首先输入第一个数,然后再输入第二个数,我可以得到两个数的值。而如果说我要得到这一个两个数相加之后的一个结果呢, 我们可以通过 rayten 函数去获得。好,下面我们来就讲解一下 rayten 函数。 rayten 函数呢,是函数的一个 返回值。好,通常呢,我们希望函数调用主调函数得到一个确定的值,这就是函数的返回值。 好,下面有详细的说明。函数的返回值呢,是通通过 return 语句来获得的,当不需要返回值的时候,可以省略。刚才我们做的就是没有返回值的情况,我们直接在前面加了一个 word, 对吧?好, return 语句的后面可以是 常量,也可以是表达是,例如 a 大于 b。 ok, 好,那我们 同样的用 vs 二零一三做一个小小的测试好,还是刚才的代码我们进行注视啊,我们直接删除,我们重新写。还是这个范函数,我们测 测试一下瑞特语句,怎么使用瑞特语句呢?他返回什么样的一个类型,一定是范这个名字之前的这个类型所决定, 比如说我现在写的是一个印特,尽管你的返回词是一个波尔类型的,或者说是一个差类型的,他最后他都会变成一个印特类型的,或者变音器直接提示你的错误。 所以一个函数的返回值,一个函数的返回值是什么类型?通过函数定义的时候已经确定了,并不是你的瑞特与句来决定。 好,现在我们想得到一下 x 和 y 的值,然后把 x 和 y 的值返回去,怎么办?第一种情况, return, return, 刚才说 return 后面 也可以加一个表达式,对吧?所以我们直接把它的和返回去 x 加上 y, 或者说我们更确切的,我们打一个小小的括号,现在我得到的这一个硬头类型就是 x 加 y 之后的一个结果。好,现在我们来调用一下方案函数。 第二,用方案函数之后, x, 比如说是十, y 是二十,也就是我们刚才十餐和行餐里面的第二点 时餐呢?它可以是长量,可以是变量,甚至说可以是函数,对吧?现在我们用的就是一个长量十和二十。好,对于这样的一个函数,我们调用完之后,我们怎么得到它的一个结果?我们怎么得到它的一个返回词?下面 就有这样的一个介绍啊。好,这是函数的生命和嗯定义了。好,怎么去得到这样的一个表达式呢?怎么得到这样的一个值呢?下面我们可以测一下啊,直接在前面定义一个接收值,比如叫上等于 范十加二十,得到了结果是多少呢?我们把结果打印出来,我们看一下上到底是多少呢?百发号地。 好,我们结果是什么?就是上这一个电量,对吧?好,我们打印看一下,最后的结果。 好,直是三十,说明一个什么问题?说明这个丧确实是他的一个返回 值,他把这个值返回之后,等于我拷贝了一份,把这个拷贝的这个东西给了谁呢?给了这个丧,如果你这个地方没有丧,他就不会把这个值传递给我们,而直接进行丢失。 你这个地方不一定说要接收值,还是有返回值,你可以接收,也可以不接收。如果你接收的话,一定要和他的类型相匹配,这里返回的是一个硬头类型,那你就有用一个硬头类型的一个变量进行接收,等于这一个范。 如果说这里返回只是大把类型,我们用大把类型去接收, ok, 这是他的一个返回词。好,那现在如果,哦,好,我们刚才测了第一种情况啊, x 加 y, 把瑞特当做一个表, 好的,是返回。还有第二种情况,什么情况?就是我定一个变量叫做上,比如说等于 x 加上 y, 然后我们把上的值返回去,同样的,这也是可以的,这个上和这个上不是同一个上。 ok, 好,最后得到了十加二十的结果,改上函数,然后我们把上变量,我们把上打印出来。好,这就是 reton。 返回值。 好,对于瑞特呢,并不是所必须的,有的函数我们并不一定要得到最后的一个结果,比如说我这个函数,我只想让他打印出一个值,打印出我的参数的值,把印特歪的值打印出来就可以了,并不一定需要参数。呃,并不一定需要他的一个返回值, 所以我们这个地方根本没有必要 rate, 对吧?如果没有必要 rit 的情况呢?我们就直接在函数的前面加一个 word 就可以了。 好,在前面加一个 word 代表没有没有返回之,如果没有返回之的情况,我们用一个变量去接收就是一个错误的。 ok, 好, 如果没有返回词,我们直接调用范函数,他打印的结果就是十,对吧。 ok, 我们看一下结果, 好,最后的结果是十对不对?所以对于一个函数来说,他的 返回值不是必须的,可有可无,根据你的业务需求来。 ok, 这就是我们今天所讲的一个函数的返回值。一个 食餐,一个行餐。 ok, 好,我们的下一节课给大家讲函数的声明和定义。好,我们这一节课就到这里,感谢大家来到潭州教育,我们下一节课再见!

在用数组元数做函数十餐时,把十餐的值传给行餐,是直传递的方式, 数据传递的方向是从十三到形象形成单向传递。我不知道有几个人看得懂这一句话啊?我不知道有几个人看得懂这句话啊?你理解一下,这个有几个核心词你要看懂。第一是数组元素, 数组元素表达的是吗?就是如果你用数组中的一个元素,记住啊,我不是说数组,我说的是数组中的一个元素,也就是假设你有一个印特 a 十的数组,哎呀,十个元素的 a 数组,我先传一个 a 八进去或者 a 五进去 啊,可不可以啊?是可以的,数字元素是可以,是可以直接传进去的。那么呢,他是说能做时餐,不能做行餐,你定义函数的时候不能说 faction 啊, f 括号 a 五啊,不能这样定义啊,你只能做时长,就是说他能作为一个实际的直传递到一个函数里面去,但是呢,你不能在定义函数的时候说我就要那那一排的第五个啊,这就不行了。至于他这原因,他说什么是要临时分分整组单元的,是不能实 实际那个什么呢?你现在不能理解是不是?不能理解就算了,实际吧,好不好?反正你就记得,如果一个数组的元素要做,要做要做,参数是可以,作为,作为一个传进去的参数是可以的,作为定义是不可以的啊,那我估计马上就是例子了。来来来,来。


大家好,我是小林。这节课再单独讲一下 c 源的参数。首先来看什么是形式参数,第十行的耐磨一和耐慢,他就是形式参数。什么是实际参数呢?比如说第六行括号里边的三和五,他就是一个实际参数。 我们是通过函数调用,将三和五的值传递给形式参数。经过第十二行代码做一些落地处理,最后将大的值重新返回到函数调用处。这是一个完整的闭环。看到这的小伙伴可以给小丽点个赞,好下课。