通常在进行函数调用时,主调用函数与被调用函数之间具有数据传递关系。这种数据传递是通过函数的参数实现的。在定义一个函数时,位于函数名后面圆括号中的变量名称为“形式参数”,而在调用函数时,函数名后面括号中的表达式称为“实际参数”。形式参数在未发生函数调用之前,不占用内存单元,因而也是没有值的。只有在发生函数调用时才为它分配内存单元,同时获得从主调用函数中实际参数传递过来的值。函数调用结束后,它所占用的内存单元也被释放。
实际参数可以是常数,也可以是变量或表达式,但要求它们具有确定的值。进行函数调用时,主调用函数将实际参数的值传递给被调用函数中的形式参数。为了完成正确的参数传递,实际参数的类型必须与形式参数的类型一致,如果两者不一致,则会发生“类型不匹配”错误。
例2-26 计算一个整数的正整数次幂。
程序执行结果:
在这个程序中定义了一个计算整数的正整数次幂的函数int power(int x,int n);它有两个整型的形式参数x和n。在程序开始时,变量x和n是不占用内存单元的,因此也是没有值的。在主函数main()中先从键盘输入两个整数值a和b,然后通过函数调用语句c=power(a,b);将实际参数a和b的值传递给被调用函数power()中的形式参数。调用发生时,形式参数变量x和n被赋予实际参数a和b的值,从而使函数power()能按实际参数的值进行计算。从这个例子可以看到,形式参数和实际参数可以不同名,但它们的类型必须要一致。
一般情况下,希望通过函数调用使主调用函数获得一个确定的值,这就是函数的返回值。例如,上例中的函数调用语句c=power(a,b);就是将函数power()的返回值赋给变量c。函数的返回值是通过return语句获得的,如果希望从被调用函数中带回一个值到主调用函数,被调用函数中必须包含return语句。
一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个return语句起作用。return后面可以跟一个表达式,例如,return(x>y?x:y);这种写法只用一条return语句即可同时完成表达式的计算和函数值的返回。return后面还可以跟另外一个已定义了的函数名,例如:return keyval(rdkey);采用这种写法可实现函数的嵌套调用,即在函数返回的同时调用另一个函数。
函数返回值的类型确定了该函数的类型,因此在定义一个函数时,函数本身的类型应与return语句中变量或表达式的类型一致。例如,上例中power()函数被定义为int类型,return语句中的变量p也被定义为int类型。如果函数类型与return语句中表达式的值类型不一致,则以函数的类型为准。对于返回的数值数据可以自动进行类型转换,即函数的类型决定返回值的类型。如果不需要被调用函数返回一个确定的值,则可以不要return语句,同时应将被调用函数定义成void类型。事实上,main()函数就是一个典型的没有返回值的函数,因此可以将其写成void main()的形式。由于void类型的函数没有return语句,因此在一个void类型函数的调用结束时,将从该函数的最后一个花括号处返回到主调用函数。
例2-27 使用void类型函数的例子。
程序执行结果: