C语言程序设计(第4章函数)3
4.3函数的调用和参数
如果一个函数要使用参数,就必须定义接受参数值的变量。
4.3.1形参和实参
定义函数时填入的参数称为形参,简称形参,它们与函数内部的局部变量具有相同的作用。参数定义在函数名之后,函数开头的花括号之前。
调用时填入的参数称为实参,简称实参。
需要确认定义的正式参与调用函数的实际参数类型是一致的,同时需要保证调用时正式参与实参的个数是一一对应出现的。如果不一致,就会产生意想不到的结果。与许多其他高级语言不同,(是健壮的,它总是做你甚至不想要的事情,几乎没有运行时错误检查,也根本没有范围检查。作为一个程序员,你必须小心确保没有错误和安全操作。
4.3.2赋值调用和引用调用
一般来说,向函数传递参数有两种方式。第一种方法叫做“按值调用”,将参数的值复制到函数的形参中。这样,函数中形参的任何变化都不会影响调用中使用的变量。
向函数传递参数的第二种方式是“通过引用调用”。此方法将参数的地址复制到形参。在函数中,该地址用于访问调用中使用的实际参数。这意味着形参的改变会影响调用时使用的变量(详见后面章节)。
除了少数情况,C语言使用赋值调用传递参数。这意味着通常不可能更改调用中使用的变量值。请参见示例4-9。
【例4-9】
main()
{
int t = 10;
printf("%d %d ",sqr(t),t);/* sqr(t)是函数调用,t是参数*/
}
int sqr(x) /*函数定义,x是形参*/
intx;
{
x = x * x;
return(x);
}
在这个例子中,传递给函数sqr()的参数值被复制到形参x中,当执行赋值语句x = x * x时,只修改局部变量x。用于调用sqr()的变量t仍然保存值10。
执行器:
100 10
记住,传递给函数的只是参数值的副本。函数内部的所有变化都不能影响调用中使用的变量。
4.4递归
C语言函数可以自己调用。如果函数内部的语句调用函数本身,则称为“递归”。递归是一个自己定义的过程。也可以称为“循环定义”。
递归的例子很多。例如,定义整数的递归方法是用数字1、2、3、4、5、6、7、8、9加减一个整数。比如数字1 5是7+8;数字2 ^ 1是9+1 ^ 2;数字1 2是9+3。
一种递归计算机语言,其函数可以调用自己。一个简单的例子是计算整数阶乘的函数factor()。数n的阶乘是1和n之间所有数的乘积,比如3的阶乘是1×2×3,就是6。
factor()及其等价函数fact()如例4-1 0所示。
【例4-1 0】
factor(n)/*递归调用方法*/
int n;
{
int回答;
if(n = = 1)
return(1);
答案=因子(n-1)* n;/*函数本身调用*/
return(答案);
}
【例4-11】
fact(n)/*非递归方法*/
int n;
{
int t,a n s w e r;
答案= 1;
for(t = 1;t < = n;t++)
answer = answer * t;
return(回答);
}
非递归函数fact()的执行应该很容易理解。它从1到指定值的末尾应用一个循环。
在循环中,依次将每个数乘以“变”的乘积。
factor()的递归执行比fact()稍微复杂一些。用参数1调用factor()时,函数返回1;其他值调用将返回乘积因子(n-1) * n..要求这个表达式的值,用(n-1)调用factor(),直到n等于1,调用开始返回。
计算2的阶乘时第一次调用factor()会导致第二次调用带有参数1的factor()。这个调用返回1,然后乘以2(n的初始值),答案是2(把printf()语句插入factor()中,看看各级调用及其中间答案,很有意思)。
0条评论