C语言零基础入门—函数-02
本节课的任务是:
函数的复杂调用。(嵌套,递归,传递数组)
01 - 函数的复杂调用
我们前边说了一些函数的简单调用,主要分为以下的两种方式,在这里回顾一下:
1、没有返回值的函数调用。
2、有返回值的函数调用。
然后下面我将讲一下函数的一些复杂的使用方式。
01.1 - 相对简单的调用
01.1.1 - 函数表达式
#includeint max(int x,int y){ if(x > y){ return x; }else{ return y; }}void main(){ // 函数返回的值没有保存直接参与运算。 int num = 2 * max(3,2); printf("计算的结果是:%d\n",num);}
这个函数做一下几点讲解:
我们自定义的max函数的功能是求出传入的两个参数中的最大值。
2 * max(3,2)
:我们直接把函数参与计算,它实现的功能就是将求得的最大值直接乘2。
01.1.2 - 函数参数
#includeint max(int x,int y){ if(x > y){ return x; }else{ return y; }}void main(){ int num = max( 1, max( 3, 2) ); printf("计算的结果是:%d\n",num);}
这个函数做一下几点讲解:
我们自定义的max函数的功能是求出传入的两个参数中的最大值。
max( 1, max( 3, 2) )
:我们直接把函数的返回值 当作参数 再次调用函数,它实现的功能就是求出三个数的最大值。
01.2 - 嵌套调用
其实嵌套调用还是相对简单的,因为在生活中我们还是经常使用到的,举一个简单的例子(我还是看图举例子吧):
讲解:
小明暑假要去补习班,但是他想要去找小红一起去补习班,于是就在半路转去找小红,可是到了小红家,小红说要去找李华,于是他们一起去找李华,然后在一起去补习班。具体的流程就是途中的黑色序号标注的。
如果把:“小明去补习班要找小红,小红去补习班要找李华,最后三人一起去补习班”。这三件事情看作是函数的话,是不是体现了一种函数里边还有函数的效果,此时,函数里边的函数,就叫做嵌套函数。
于是用一个准确的图来解释就是:
讲解:
首先任何C语言程序都是从main函数开始执行的,但是当main执行着执行着(序号1),发现这个时候需要用到函数a了(序号2),于是停止main的执行,进去执行a函数。
当a函数执行一半,发现这个时候需要用到函数b了(序号3),于是停止a函数的执行,进去执行函数b(序号4)。
于是一直执行b函数,直到函数b执行结束(序号5),于是将结果返回到 a函数中调用 b函数的地方(序号6)。
这个时候函数a发现 自己已经得到函数b执行后的数据了,于是继续执行自己(a函数)(序号7),直到结束掉a函数的执行。于是把结果返回到调用自己的main函数(序号8)。
main函数发现自己已经得到函数a的计算结果后,就继续往下执行代码了,直到函数结束(序号9)。
这就是嵌套函数的调用
接下来举一个具体的代码来感受一下。
#includevoid b(){ printf("b函数开始执行了\n"); printf("b函数执行结束了\n");}void a(){ printf("a函数开始执行了\n"); b(); printf("a函数执行结束了\n");}void main(){ printf("main函数开始执行了\n"); a(); printf("main函数执行结束了\n");}
执行结果:
结果分析:
01.3 - 递归调用
递归嘛,说白了就是一句话的事:一个函数本身,直接或者间接的又调用他自己。画个图看看:
解释:
直接调用:就是 函数f中 直接在调用 函数f。
间接调用:就是函数f1 调用f2,然后f2在调用f1。
代码:
1,直接调用的例子:
#includeint JieCheng(int n){ printf("传入%d,本次要求:%d * %d\n",n,n,n-1); if(n == 0){ return 1; } return n * JieCheng(n-1);}void main(){ int Sn = JieCheng(4); printf("%d\n",Sn);}
首先说一点,递归属于比较难的内容,大家写程序尽量不要往这方面去想,我这里讲递归的目的是让大家学着能看懂别人写的递归程序就可以了。
程序讲解:
01.4 - 传递数组
其实关于数组的传递,基本上都牵扯了指针,所以这里数组的传递只是简单的讲一下,等后边学完数组,慢慢的使用起来就会了。
其实数组的简单传递挺简单的,就一句话:要传递的数组实参是什么样子,那么形参就怎么定义。
01.4.1 - 一维示例
#includevoid Dayin(int b[5]){ for(int i=0 ; i<5 ; i++){ printf("%d ",b[i]); }}void main(){ int a[5] = {1,2,3,4,5}; Dayin(a);}
根据上边说的这句话:要传递的数组实参是什么样子,那么形参就怎么定义,我们来分析。
要传递的数组实参是:数组a,他是长度为5的一维数组。
因此,形参也应该 定义为长度为5的一维数组,于是有:int b[5]
01.4.2 - 二维数组
#includevoid Dayin(int b[2][3]){ for(int i=0 ; i<2 ; i++){ for(int j=0 ; j<3 ; j++){ printf("%d ",b[i][j]); } printf("\n"); }}void main(){ int a[2][3] = {{1,2,3},{4,5,6}}; Dayin(a);}
同理根据上边说的这句话:要传递的数组实参是什么样子,那么形参就怎么定义,我们来分析。
要传递的数组实参是:
int a[2][3]
,他是一个2行3列的一个二维数组。因此,形参也应该 定义为长度为2行3列的二维数组,于是有:
int b[2][3]
。
好了,数组作为参数的简单传递就讲到这里,也是很简单的。