
4.5.2 通过给函数传递参数来赋值
在声明函数原型的时候,如果我们打算让这个函数带有参数,那么还需要声明这些参数,这时的参数称为形式参数(formal parameter,简称形参)。形式参数没有值,只有类型,另外,你还可以给它命名。等到真正调用这个函数的时候,我们会把实际参数(actual parameter,简称实参)传给该函数,这时,程序会将实际参数中的值复制到形式参数所表示的相应变量里面。
下面这段范例程序声明了printDistance()函数的原型,并且给出了该函数的完整定义:


我们要关注的是调用printDistance()函数时传入的参数feet与程序在执行该函数(也就是执行我们给printDistance()函数所写的定义代码)时所使用的参数f之间的关系。
由printDistance()函数的原型可知,该函数接受一个double型的参数。我们在原型里面并没有给这个参数命名,因为C语言不要求函数原型里的参数必须带有名称。就算我们在编写函数原型时指出了参数的名称,这个名称也不一定要跟正式定义这个函数时所用的参数名相同。在给该函数编写定义代码时,我们使用的参数名是f。程序在执行到printDistance()函数时,会创建一个名为f的double型变量,并把调用该函数时传入的值复制到f变量中。这就相当于把main()函数里面那个feet变量赋给printDistance()函数的f参数。实际上,程序正是这么做的。程序在刚开始执行printDistance()函数时,f参数(即f变量)的值跟我们调用该函数时所传入的feet一样,都是5280.0。接下来,我们可以在函数里面操作这个f变量,具体到本例来说,我们把f变量的值跟3.0相除,并把结果赋回给f变量,最后,将f变量的新值打印到控制台。f变量的生命期,在程序执行完它所处的这个函数(即printDistance()函数)时就结束了。我们在该函数中对f所做的修改不会影响main()函数里面的feet变量。
为了把printDistance()函数所执行的操作表达得更明确一些,我们应该将这个函数的代码改成下面这个样子。你在编写其他函数时也应该像这样来写:

修改之后的版本更加清晰:
□我们把参数的名称由f改为feet,让调用这个函数的人清楚地知道这个参数指的是英尺数。
□我们明确地声明了一个叫作yards的变量,用来表示换算之后的码数。我们把feet参数(也就是有待换算的英尺数)与3.0相除的结果赋给该变量,而不是像旧版的函数那样把该值写回f参数。
对于printDistance()函数的feet参数与yards变量来说,它们的生命期都从程序执行函数块开始,到程序执行完函数块结束。