1、 形参与实参形参与实参 1、形式参数:定义函数时函数名后面括号中的变量名;、形式参数:定义函数时函数名后面括号中的变量名;2、实际参数:调用函数时函数名后面括号中的表达式或变量名。、实际参数:调用函数时函数名后面括号中的表达式或变量名。c=max(a,b);(main 函数)(max 函数)max(int x,int y)int z;z=xy?x:y;return(z);例例 比较两个数并输出大者比较两个数并输出大者main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Max is%d,c);max(int x,int y)int z;z=x
2、y?x:y;return(z);形参实参函数的参数及传递方式函数的参数及传递方式 值传递方式值传递方式 函数调用时函数调用时,为形参分配单元为形参分配单元,并将实参的值并将实参的值复制复制到形参中;调用结束,形参单元被释到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值。放,实参单元仍保留并维持原值。特点:特点:1、形参与实参占用不同的内存单元 2、单向值传递:只能由实参传向形参,而形参的值不会影响到实参的值。函数的参数值传递方式函数的参数值传递方式/*值传递举例*/#include main()int x=7,y=11;printf(x=%d,y=%dn,x,y);swap(x,y
3、);printf(x=%d,y=%dn,x,y);swap(int a,int b)int temp;temp=a;a=b;b=temp;值传递方式举例值传递方式举例例子图解例子图解711x:y:调用前:调用前:调用:调用:711a:b:711x:y:swap:711x:y:117a:b:temp调用结束:调用结束:711x:y:嵌套调用嵌套调用 C规定:规定:函数定义不可嵌套函数定义不可嵌套,但,但可以嵌套调用可以嵌套调用函数函数函数的嵌套调用函数的嵌套调用main()调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b#include void main()int a,b,c,
4、d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);/*求最大与最小之差求最大与最小之差*/int dif(int x,int y,int z)return max(x,y,z)-min(x,y,z);/*求最大数求最大数*/int max(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);/*求最小数求最小数*/int min(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);函数的嵌套调用举例函数的嵌套调用举例求求三三个个数数中中最
5、最大大数数和和最最小小数数的的差差额额main()调用函数调用函数dif输出输出结束结束dif函数函数max函数函数调用函数调用函数max调用函数调用函数minmin函数函数定义:函数直接或间接的调用自身叫函数的递归调用定义:函数直接或间接的调用自身叫函数的递归调用调调f2调调f1f1()f2()f()调fint f(int x)int y,z;z=f(y);.return(2*z);int f1(int x)int y,z;z=f2(y);.return(2*z);int f2(int t)int a,c;c=f1(a);.return(3+c);函数的递归调用函数的递归调用说明说明:C编译
6、系统对递归函数的自调用次数没有限制编译系统对递归函数的自调用次数没有限制,每调用函数一每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出所以递归次数过多,可能引起堆栈溢出)1()!1()1,0(1!nnnnn#include int fac(int n)int f;if(n0)printf(error!);else if(n=0|n=1)f=1;else f=fac(n-1)*n;return(f);main()int n,y;printf(Input a integer number:);scanf(%d,&n);y=fac(n);printf(%d!=%1d,n,y);递归调用求阶乘递归调用求阶乘作业:P102:3-5