1 函数的概念及其作用;
C语言中的函数是一个程序的重要组成部分。
其可以将一个大的程序进行简化,并且可以重复使用,用于将一个大项目拆为很多小项目。
2.函数的组成;
C语言中一个函数是由三部分组成的,分别为返回值类型,形参,函数名。
这三部分组成。
可见上面函数是一个返回类型为double,函数名为Pow,两个形参n,k的函数。
先从返回值类型开始,常见类型有整形,浮点型和字符串。
再从函数名说起,函数名可以自拟。
唯一值得一提的就是形参了,用于接收实参,形参不是本身就有其位置的,而是用形参是时候,它才有它的位置。
以上是一个简单函数,由上可见,刚开始x和y是没有地址的,当函数接收到我们传给它的a和b时。
将a的值赋给了x,将b的值赋给了y,此时x,y才开始创建,才有地址,当出了函数范围后,形参自动销毁,但是我们看地址,x,和y的地址仍然存在,但是x和y的值不存在了。
3.函数的调用;
如下
当我们想实现a+b时,我们可以用如上方法,将要执行a,b相加的程序放入add(自己命名的)函数中来实现这样的算法,给大家看一下过程。
当我们进行调试时,可以看到,首先从主函数开始进行,当我们走到底167行的时候,按F11可以进入函数里面,将a,b两个实参被x,y两个形参接收,值得一提的时,传参时的形式必须和接收参数的形参形式吻合,不然会报错
注意这里将add(a b)之间的逗号去掉,就会报错,进入函数后,将a+b的值进行返回,存到sum里进行输出。
函数调用时,写在main函数上面不需要声明,写在main函数下需要声明,告诉编译器你要调用这个函数。
以上就是声明函数,将它的函数明放在开头,将内容放在main函数下面。
在工作中写代码时,肯定不止这一个函数,如果多个函数我们应该怎么操作呢?
可以新建一个头文件,将所有想用到的函数放在里面,一样可以调用,如下所示。
新建头文件,将函数内容放入头文件中,想用的时候直接引用头文件就好。
这样便是。
注意,传参并不是通用的,当我们想用函数实现a,b互换时,我们如果用传参来做的话,会怎样?
看看下图。
可见,传参后,a,b值无任何变化,调试看看。
可见,x和y的值发生了交换,而a,b的值并未改变,因为它只改变了函数内局部值,没影响到实参,因为形参和实参不是一块空间,最后回到main函数栈释放。
下面教大家一种方法。
传址调用;
我们将a,b的地址传给形参,看看结果如何。
将传入的参数,改为地址,给没学到指针的小伙伴们解释一下,x是指针变量,里面存放的是a的地址,*为解引用操作符,*x=a,不理解的看下图。
pa存放的是&a的地址,*解引用,可以理解为,*pa=a.
如上所示,显然pa和a是同一地址。
4.函数的嵌套
这个用法非常简单哈,就和我们之前学的if嵌套差不多,就是一个函数套一个函数,看下代码。
被嘲讽到了吧,嘿嘿。
这就是,我调用我自己,我套我自己,但是这种调用很费空间,当你调用一个函数时,它会重新申请一块空间,这种死循环调用会浪费大量空间,为了防止这种情况的发生,我们用嵌套的时候一定要谨慎啊!
5。函数嵌套的使用,递归!
这块就有点难度啦,其实也不能算太难,希望家人们可以同归这篇文章学会递归!
先从递归的作用开始,递归的好处在于,大事化小,小事化了。主要思想在于拆分,给大家看看下面案例。
求某数的阶乘;
可见,上面是求阶乘的函数,下面的主函数,那函数具体是怎样运作的呢?
首先n的阶乘为n*n-1*n-2....1,因此我们可以简化为n(n-1)!,再往下分n*(n-1)*(n-2)!
因此我们这个表达式也是如此,
将n-1再次放入函数中,直到它为1时,函数开始返回,具体过程为下图。
先循环嵌套,直到找到那个确定的值的时候,再进行返回操作。
这就是递归。
上面是一个求5!的过程。可见,将5!分为求4!直到求1的!,把大事化小,小事化了,做到了真正的接化发!
以上是递归的简单使用,读者可根据自身才能,多试试一些其他递归,比如求x的y次方之类的。
函数基本知识就到这里,编者能力有限,以上仅供参考。