前言
前面几期我们学习了循环分支,数组的相关内容,那么今天我们来学习函数这一章的内容,函数这一章节同样重要,后期的各个内容也同样也需要函数,我们先将上期所留下来的问题解决一下,
(本人实力有限,可能对知识的认识有误,欢迎指正);
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是函数
函数,相信我们初中高中的时候就听过这个名词,但是在c语言中意义却截然不同,在c语言中函数在某些书籍文献里翻译为:子程序,函数或者说子程序就是可以完成某项特定的任务的代码,就好像如果我们要制作一根火腿肠,这个部门专门封装,那个部门专门负责售卖一样,把自己的任务做好即可,不用管其他的那些事情,具体等到下边讲述的时候就知道了。
1、库函数及自定义函数
函数又分为库函数和自定义函数,自定义函数好说看名字我们就大概知道这个是干什么的,自定义就是自己定义的函数,这里主要解释一下什么是库函数。为什么会有库函数这样的东西存在呢?这里举个例子大家就知道了,假如说我们是制作火腿肠的厂商,既然是火腿肠的厂商那么我们肯定要有制作火腿肠的步骤吧,可是制作火腿肠需要机器来制作,那我们就制造机器,可是随着越来越多的人发现火腿肠挣钱都来制作火腿肠了,可是那么多的火腿肠商都要建造机器的话有个问题,不好管理,制作出来的火腿肠质量参差不齐,哪里有问题都不知道,那怎么办呢?官方想出来一个妙招就是统一制作一个火腿肠制作工厂,所有工厂都不自己制造机器了,统一把原材料交给统一工厂来做,这样就方便多了,那么这个独立出来的官方工厂其实类似于库函数。我们写代码的时候不用自己再从头开始写,要不然的话太过于麻烦,所以我们直接调用库里提供的函数就可以了,但是调用库函数之前需要写头文件来告诉编译器,我要调用这个库函数,这样就不会报错了。那么这里给个链接大家可以去查一下,https://zh.cppreference.com/w/c/header,这个链接是库函数的头文件先关的这同时也是C/C++官方的链接。那么这里简单的介绍一个库函数吧,写一个计算平方根的函数
这里就用了sqrt库函数来写n的平方根,注意看最上边有两个include就说明有两个头文件,而sqrt函数需要包含math.h这个头文件。这里先了解一下库函数关于函数的使用我们下边再讲;
二、函数的调用
1.
那么函数应该怎么用呢?正如上文所讲,函数是可以完成某项特定的功能的,就像上文的sqrtNum函数是不是专门用来计算平方跟的呀,给你讲一下流程呦,首先函数从main函数开始进入,输入一个值给了n,随后程序继续往下走到了我们的sqrtNum处了向上走找到那个sqrtNum之后执行程序,最后return返回计算的值给了r随后打印退出程序,与
这个程序是一样的,有没有种熟悉的感觉,像不像上期讲的goto语句,有相同之处也有区别,他们是不是都像传送门一样传送到指定的位置,函数指定到跟它名字相同的地方去,但是函数去调用传送的时候要将你所想要解决问题的变量带过去,就像火腿肠厂一样把原料带过去最后才能return返回你的产品,但是函数括号内如果什么都没有也不报错,但也就只能传送了,就像上边计算sqrt一样将你所要计算的值n传过去,在函数这个程序内加工好了再给你返回,
看,也不报错。
函数的结构是:类型 函数名(形式参数),
这里的类型就是int char这种的,那这时候有细心的读者就会问了,哎作者作者,你上边的那个图的类型为什么写的是void呢?void是不返回的,你只要写了这个void函数就不会给你返回任何东西了,就像是制作火腿肠的厂子自己把制作的火腿肠自己都吃了啥都没给,记得函数要写大括号,这样我们就写出来一个函数了,那我们再写一个关于加法的函数,在这个函数里,将如何创建一个函数运用彻底掌握吧
具体什么之后函数类型用什么得看自己想要输出什么值了,最后返不返回也是看自己的需求要不要求返回。
2.形参与实参
接下来讲一下形参与实参,形参顾名思义形式参数,实参顾名思义实际参数,既然我们在上文说过我们在main主函数里的函数括号内要将我们所需要的变量输入,例如上边计算两个式子的和,我们的目的是计算两个数字的和,所以我们将我们所需要算的数值变量输入函数,add(i,j),括号里的i和j,这叫实参也叫实际参数,是把真实的数值传过去了,那我们上边用来接收的函数内的参数就叫形参,为什么main函数里的函数参数叫实参而调用函数却叫形参?实参是真实的数值,难道形参就是假的吗?我们知道数据存储是需要空间的,当我们形参有数值后才会申请空间来存储数值,将数值存储后我们可以访问地址,所以我们通过两者的地址来看一下有什么区别
我们发现虽然形式参数的数值和实际参数一模一样都是4和5,但是它们两个的空间地址不一样,这说明了什么?实参和形参不在同一处空间,这是不是就说清楚了,既然不在同一个地方自然而然地址就不一样了,那为什么形参和实参数值一样呢?复制,形式参数是实际参数的临时拷贝,就是说形参是拷的实参里的数值懂了吧,对形参修改的话实参不受影响,对拷贝的内容影响不会影响本源的。
二、数组在函数的应用;
我们知道数组如果想要传参的话传的是数组元素的首地址,那该怎样调用函数打印数组呢?学过数组的应该知道,因为数组是多个元素的集合,所以在打印数组时要用到循环知识,那么我们可以在主函数前用循环将数组中的元素一个一个的传到函数中去然后打印,具体实现看代码
在形参处我们用一个变量i来接收实参传过来的元素,而实参处通过一个for循环将数组中遍历一个元素后就将这个元素传到形参处,打印,循环往复将整个数组打印出来,当然我们也可以在形参处创建一个数组,用形参数组接收所有的实参传过来的元素,最后打印这样也是可以把数组打印出来的。
2、知识点总结
知识点太多总结一下,也不可能全部敲了,这里总结一下大部分函数关于数组的知识点
1、函数的形式参数要和实际参数的个数相匹配。
2、函数的实参是数组,形参可以写成数组形式的(上代码展示过了)
3、形参如果是一维数组的话,数组大小可以省略(void hanshu(int arr【】))
4、数组传参的话形参不会创建新的数组;这里与只传参数有所不同
三、函数的声明
如果我们所需要调用的函数在主函数的后面的话就会报错,例如
就这样的,为什么呢?因为我们的编译器从上往下阅读,等碰到main()函数了进入程序,一看第六行add(),emm?编译器从第一行开始往下看没看见什么add函数啊,你虽然在main函数下有add函数,但是这个编译器就是和人脑不一样,它从上往下看没有函数就报错,那为什么之前没事,能用呢?我们发现我们之前的函数都是在main函数之前的编译器从第一行往下阅读后发现,哦这里有一个add函数就记住了,继续往后直到main函数进入程序,后边再次碰到add函数了,计算机一想咦?好像见过就这样能调了,那这次函数在main()函数后边编译器读不到怎么办,哎这就要用到函数的声明了,那声明是啥子意思呢?就是告诉编译器我这有一个函数记得看,等编译器进入main函数后碰到add函数了,一想好像见过,就这样计算机从头到尾接着看,咦?好家伙在main()函数后边待着呢,然后就执行我们的add函数,这就是函数的声明具体过程,接下来给一段代码带大家体验体验
声明记得写分号,就是把函数类型,函数名,形参在main函数之前写一遍再打个分号就行了;
四、函数之间的调用
函数与函数之间也可以相互调用,但是还是你一点被调用的函数一定要在调用函数的前面要么就声明一下,跟上边刚讲的东西逻辑一样哦,接下来就来实现一下
我们可以发现在main函数内调用add函数,进行计算两值的和,在第6到第10中进行了两值相加的操作后又调用了printarr函数来打印数值,这就是一个函数调用函数的操作;大家可以再看看哦。
2、传值调用,传址调用
在以上内容讲的全部是传值调用,顾名思义传值调用就是传数值,传址调用就是传地址,上边内容讲的全是传值调用所以这里主要讲述一下传址调用,这个指的是在调用函数时,函数将地址传给形参,因此传址调用是形参可以影响实参,
这里看一下即可,因为涉及到指针了,就知道传址调用可以在形参改变实参,传的是地址即可。
五、题
利用函数来判断输入的年份是否为闰年;
总结
在本期中讲述了函数的相关用法,我们下期将会把函数与数组的内容结合起来写一个扫雷游戏,我会尽最大努力将过程以及代码条例的,敬请期待!