1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本资料仅供参考,不能作为科学依据。谢谢。本资料仅供参考,不能作为科学依据。感谢,本章重点,11.1 传给main函数参数,11.2 经过实参向函数传递函数名或指向函数指针变量,11.3 函数递归调用,11.4 函数嵌套调用,第11章 对函数深入讨论,1/11,11.1 传给main函数参数,1.1.1 算法基本概念,在第7章我们学习了函数定义和调用,以及函数之间不一样类型数据传递。在此之前,我们在编写main函数时,其后括号中没有参数。但在运行C程序时,能够经过运行C程序命令行,把参数传给C程序。main函
2、数通常可用两个参数,比如:,main(int argc,char*argv),2/11,其中,argc和argv是两个参数名,可由用户自己命名,但它们类型是固定。第一个参数argc必须是整型,第二个参数argv是一个指向字符型指针数组指针,这个字符型指针数组每个指针都指向一个字符串。,11.2 经过实参向函数传递函数名或指向函数指针变量,1指向函数指针变量定义,3/11,C语言中,函数名代表该函数入口地址,所以,能够定义一个指向函数指针存取这个地址。指向函数指针变量普通定义形式为:,数据类型标识符(*指针变量名)();,比如:int (*p)();,表示定义一个指向函数指针变量,但指向函数值必
3、须是int。,说明:,(1)函数调用能够经过函数名调用,也能够经过函数指针调用(即用指向函数指针变量调用)。,4/11,(2)(*p)()表示定义一个指向函数指针变量,这不是固定指向哪一个函数,而只是表示定义了这么一个类型变量,它是专门用来存放函数入口地址。在程序中把哪一个函数地址赋给它,它就指向哪一个函数。在一个程序中,一个指针变量能够先后指向不一样函数。,(3)在给函数指针变量赋值时,只需给出函数名而无须给出参数。,比如:定义了一个函数,int max(int x,int y);,希望指针,p,指向它入口地址,其形式是:,p=max;,5/11,(4)用函数指针变量调用函数时,只需将(*p
4、)代替函数名即可,在(*p)之后括号中依据需要写上实参。比如上例中,要调用max(a,b),能够写成:,c=(*p)(a,b);,(5)对指向函数指针变量,像p+n、p+、p,等运算是无意义。,函数名或指向函数指针变量能够作为实参传给函数。这时,对应形参应该是类型相同指针变量。比如:,double tran(double (*)(double),double (*)(double),double);,6/11,11.3 函数递归调用,C语言中允许函数递归调用,所谓函数递归是指在调用一个函数过程中,又出现了直接或间接地调用该函数本身。在此仅讨论直接递归,即函数本身调用本身。,7/11,1递归问题
5、特征,为求解规模为,n,问题,设法将它分解成规模较小问题,然后从这些小问题解方便地结构出大问题解,而且这些规模较小问题也能采取一样分解和综合方法,分解成规模更小问题,并从这些更小问题解结构出规模较大问题解。尤其是当规模,n,=1时,能直接得解。,8/11,2递归函数执行过程,为了了解递归含义,可经过一个简单例子来加以说明。比如,求斐波那契数列第,n,项fib(n)公式为:,它对应递归过程为:,long Fib(long n),if(n1,递归结束条件:Fib(n)=nn=1,凡是能够表示成上述式子数学问题均能够用递归来实现,在递归函数中普通可采取双分支语句来实现:,if (递归结束条件)return(递归终止值),else return(递归计算公式),10/11,11.4 函数嵌套调用,在C语言中,全部函数都是平行,即在C程序中函数不允许嵌套定义,但C语言允许函数嵌套调用。所谓函数嵌套调用是指一个函数调用了另一个函数,被调用函数在执行过程中又调用了另外一个函数。,11/11,