8.3 函数参数和函数返回值
考点3 函数参数及函数的返回值
真考链接
考点3要求在选择题中通常填写相应的形式参数或者实际参数。此知识点难度适中,要重点理解重点掌握,其考核概率为80%。在操作题考试中,通常要求编写一个子函数实现某种特定的功能,且返回必要的值,考核概率为60%。
1.形式参数和实际参数
在程序中调用函数时,绝大多数情况下,主调函数和被调函数之间会发生数据传递关系,这就要用到前面提到的有参函数。在定义函数时,函数名后面括号中的变量称为“形式参数”(简称“形参”);在主调函数中,函数名后面括号中的参数(可以是一个表达式)称为“实际参数”(简称“实参”)。
说明:
(1)实参可以是常量、变量或表达式。
(2)在被定义的函数中必须指定形参类型。
(3)实参与形参的类型应相同或赋值相兼容。
(4)C语言规定,实参变量对形参变量的数据传递是“值传递”,即单向传递。只能由实参传递给形参,而不能由形参返回来给实参。在内存中,实参单元与形参单元是不同的存储单元。
(5)在调用函数时,给形参分配存储单元,并将实参对应的值传递给该存储单元。调用结束后,形参单元被释放,实参单元仍保留并维持原值。
2. 函数的返回值
函数的返回值就是通过函数调用使主调函数能得到一个确定的值。函数的值通过 return 语句返回,return 语句的形式如下:
return 表达式;
或return(表达式);
或return;
return 语句中表达式的值就是所求的函数值。此表达式值的类型必须与函数首部所说明的类型一致。若类型不一致,则以函数首部的类型为准,由系统自动进行强制转换。
小提示
1.数组元素可以作为函数的实参,与用变量作为实参一样,按照单向值传递的方式进行传递。
2.可以用数组名作为函数参数,此时实参与形参都应有数组名,此时的数组名是整个数组的首地址。
如果要确保函数没有返回值,最好使用void定义函数为无类型函数。
常见问题
如果子函数没有指明返回值,源程序应如何处理?
当函数没有指明返回值,或没有返回语句时,函数执行后实际不是没有返回值,而是返回一个不确定的值,这有可能给程序带来某种意外影响。因此,为了使函数不返回任何值,C语言规定,可以使用void定义无类型函数。
真题精选
【例1】有以下函数调用语句:
func((exp1,exp2),(exp3,exp4,exp5));
其中含有的实参个数和是( )。
A.1 B.2 C.4 D.5
【答案】B
【解析】在调用函数时,实参可以是表达式,若有两个以上的实参时,实参之间用逗号隔开。在以上调用语句中,(exp1,exp2)和(exp3,exp4,exp5)是两个用括号括起来的逗号表达式,它们之间用逗号隔开,因此,该函数调用语句中含有两个实参。总结:本题要求读者正确掌握前面学过的逗号表达式,这样才能理解本题函数调用语句中实参的个数。
【例2】以下程序的输出结果是( )。
#include <stdio.h>
func(int a,int b)
{ int temp=a;
a=b;b=temp;
}
main()
{ int x,y;
x=10;y=20;
func(x,y);
printf("% d,% d\n",x,y);
}
A.10,20 B.10,10 C.20,10 D.20,20
【答案】A
【解析】这里是传值调用,不会改变实参的值,所以输出为10,20。注意:传值调用时,只将实参的副本传给形参,在函数中只对副本进行修改,不会影响实参的值。
【例3】下列给定程序中函数fun()的功能是:计算S=f(-n)+f(-n+1)+…+f(0)+f(1)+f(2)+…+f(n)的值。
例如,当n的值为5时,函数值应为10.407143。
f(x)函数定义如下:
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
/*****found*****/
f(double x)
{
if(x==0.0||x==2.0)
return 0.0;
else if(x<0.0)
return(x-1)/(x-2);
else
return(x+1)/(x-2);
}
double fun(int n)
{
int i;double s=0.0,y;
for(i= -n;i< =n;i++)
{y=f(1.0*i);s+ =y;}
/*****found*****/
return s
}
void main()
{ printf("% f\n",fun(5));
}
【答案】(1)doublef(doublex)
(2)return s;
【解析】本题考查:函数定义,其一般形式为“类型标识符函数名(形式参数列表)”,其中类型标识符指明了本函数的类型,函数的类型实际上就是函数返回值的类型。
该程序的流程是:fun()函数对f(n)项循环累加,fun()函数采用条件选择语句计算函数f(x)的值。第一处错误在于未定义函数f(doublex)的类型,因此返回值类型为double型,所以此处函数应定义为double。第二处错误在于语法错误。