
函数调用时的实参和形参之间的数据是单向的值传递。
实参传递给形参是单向传递,形参变量在未出现函数调用时,并不占用内存,只在调用时才占用。调用结束后,将释放内存。执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中的实参的值。单向传递,只能由实参传给形参,反之不能。
形参如同公式中的符号,实参就是符号具体的值,在调用过程前必须得到赋值;调用过程就是实现形参与实参的结合,把实参的值通过调用传递给形参,相当于把值代入公式进行计算。
扩展资料:
相关的规则:
1、从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。
2、形参只能是变量,实参可以是常量、变量或表达式。在被定义的函数中,必须指定形参的类型。实参与形参的个数应一样,类型应一致。字符型和整型可以互相通用。在调用函数时,如果实参是数组名,则传递给形参的是数组的首地址。
-参数传递
答案:A
数据只能由实参单向传递给形参称为“值传递”,而不能由形参传回来给实参,A选项正确;数组名、指针等作参数,实参传递给形参的是地址值,这样形参和实参就指向同一段内存单元,在函数体内对形参数据的改变也将影响到实参。实参和形参之间不可双向传递。B、D选项错误。数据不能从形参传递给实参,C选项错误。
C语言中是可以用函数互换两个值的。
方法如下:
#include"stdioh"
int swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
main()
{
int x,y;
printf("请输入x与y的值,用空格隔开\n");
scanf("%d %d",&x,&y);
printf("x=%d,y=%d\n",x,y);
swap(&x,&y);
printf("交换后\nx=%d,y=%d\n",x,y);
}
1 外部函数是指________的函数,它可以在_________中被调用。
分析当存储类型选用“extern”时,所定义的函数称为外部函数。外部函数可以在其他编译单位中调用(需要对这个函数进行说明)。
答案存储类型是“extern”的函数
所有对该函数进行说明过的编译单位
2 假定在同一个编译单位中,函数a()调用了函数b(),则对函数b()不需要说明的情况有下列两种:_____________和________________。
分析教材中有明确答案(p116)。
答案b()函数的定义地点在a()函数定义地点之前
b()函数的数据类型是int或char
3 在函数间传递数据的四种方式中,不能把被调函数的数据带回到主调函数的是()
①值传递 ②地址传递 ③返回值传递 ④全局外部变量
分析值传递方式是利用形式参数和实际参数结合来进行数据传递的一种方式,它是在调用函数时,将实际参数的值传递给形式参数,函授调用结束后,并不将形式参数的当前值传回实际参数。
答案①
4 如果函数定义时,形式参数是整型变量,则调用该函数时,实际参数不可以是()
①整型常量 ②字符型变量
③指向整型变量的指针型变量 ④整型表达式
分析当形式参数是变量时,实际参数可以是数据类型相同的表达式(常量、变量是表达式的特例),因此,备选答案①④显然是正确的,即不符合题意。而字符型数据可以看成整型数据,所以字符型变量可以当作整型变量,因此备选答案②也是正确的,即不符合题意。只有备选答案③是错误的,因为指针型变量不是整型变量,本题答案应该选取③。
请读者注意,如果使用“指针型变量”侧是正确的。
答案③
5 若函数a()调用了函数b(),而函数b()又调用了函数a(),这样的调用称为_________________调用。
分析一般来说,只要是函数调用了自己,则称这样的函数调用为递归调用。如果函数f()调用了函数f(),我们称这样的递归调用为“直接递归调用”;如果函数f()调用了函数g(),而函数g()又调用了函数f(),这样的递归调用称为“间接递归调用”。
答案递归(或间接递归)
6 下列表达式中,不能判断字符型变量ch中的字符是英文字母(是则表达式值为非0、否则表达式值为0)的表达式是()
①ch>='A'&&ch<='Z'::ch>='a'&&h<='z'
② toupper(ch)>='A'&&toupper(ch)<='Z'
③ isalpha( ch)
④ !(isdigit(ch))
分析备选答案①中的逻辑表达式的含义是:当ch中的字符是大写字母或者小写字母时,结果为1,否则结果为0,该答案不符合题意。备选答案②中使用了系统函数toupper(),该函数功能是将参数对应的字符换成大写字母(如果参数对应的字符不是英文字母则不改变),答案中的逻辑表达式含义是:转换成大写后如果落在'A'到‘Z'之间则值为1,否则值为0。该答案也不符合题意。备选答案③中使用了系统函数isalpha(),该函数功能是判断参数对应的字符是否是英文字母,是则返回非0;否则返回0。显然该答案也不符合题意。只有备选答案④是符合题意的。分析这个答案中的表达式,其中用到了系统函数isdigit(),该函数的功能是判断参数对应的字符是不是数字字符,是则返回非 0,否则返回 0,该答案中的表达式是“! isdigit(ch)”,即 ch中不是数字字符则返回1,否则返回0,因此,该表达式不能判断ch中是否英文字母,所以本题答案应选④。
答案④
7 函数调用malloc(sizeof(long) 2)的功能是申请____________个字节的内存;这批内存的首地址是____________________。
分析 系统池数malloc(形参)的功能是申请“形参”个字节的内存,函数的返回值就是这批内存的首地址。题目中的参数是“snzeof(long)2”,sizeof(long)是长整型数据的字节数,其值为 4。而函数malloc(sizeof(long) 2)调用的参数是 sizeof(long) 2,其值为 8。
答案 8
函数调用的返回值
8 下列函数定义中,正确的是()
①int f(int x,y) ② int f(int x,inty)
{return(y);} { return(y);}
③ int f( x,y) ④ void f( int x;)
int x, int y; {return(x);}
{return;}
分析分析备选答案①:形式参数表不正确,两个整型变量应该写成 int x,int y。分析备选答案②:这是一个指针型函数,函数返回值是指向整型数据的指针值,形式参数表也是正确的,在函数体中有带返回值的返回语句,且返回值就是指向整型数据的指针变量值,该答案符合题意。分析备选答案③:形式参数表中的int y是错误的,应该为int y;这样形式参数说明中的 int y也是错误的,应该写成 int y;函数体中的返回语句也是错误的,因为这个函数是有返回值的函数。分析备选答案④:形式参数表中最后的“分号”不能有 ;函数体中的返回语句只能用“ return;”,因为该函数是无返回值的函数。9 已知梯形法求积分y=|a f(x)dx的公式如下:
n-1
y=((f(a)+f(b))/2+∑f(a+ih)) )h
i=1
其中的n是积分区间等分的间隔数目(n是任选的,越大则结果精度越高);其中的h=(b-a)/n。
函数y()是计算并返回 |a(sin(x)+cos(x))dx积分值的,请填写函数中缺少的句。
# include"math.h"
double y(a,b,n)
double a, b;
int n;
{ double sum,h;
____________________
int i;
h=(b-a)/n;
sum=(f(a)+f(b))/2;
for(i=l;i<n;i++)
sum+= f(a+ ih);
____________________
return( sum);
}
double f(x)
double x;
{ double y;
y=(sin(x)+cos(x));
return(y);
}
分析阅读程序清单可以看出函数 f()是求函数 f(X)= Sin()+ COS()值的,这个函数是完整的,没有要填写的语句。再看函数y(),这个函数是求积分的函数,其中有两个空白处。第1个空白处的前后都是数据定义语句,所以这个空白只能填写数据定义语句(包括数据、函数的说明语句)。再从函数体中使用的数据来看,凡是用到的变量要么是形式参数(a、b、n),要么是定义的局部变量(sum、h、i),不存在没有定义的变量,对于这种情况来说,需要考虑函数体中调用的函数是否需要说明。从函数体中看出,要调用的函数是f(),这个函数的定义在调用处之后出现,并且不是int或char型(是double型),所以这儿的空白要填写对函数f()的说明。第2个空白处是在循环语句之后。分析这段程序,循环前先计算出h=(b-a)/n,再计算y=(f(a)+f(b)/2)(程序中用的变量是sum)。接下来的次数
n-1
型循环显然是计算 ∑ f(a+ih),并且加到变量 sum中。
i=1
从题目给出的公式中可以看出,现在变量sum中的值还不是积分值,需要再乘以h,第 2个空白处就是完成这项工作的,所以应该填写的语句是 sum= sum h;,或者 sum=h;。
答案double f();
sum=sumh; 或者 sum=h;
10 求两个正整数的最大公约数的算法通常使用“辗转相除法”。设有两个正整数m、n,求它们的最大公约数的算法如下:
①若m<n,则交换m和n(保证m大于n)。
②计算m/n的余数r。
③若r不等于0,则令m=n、n=r,转第②步继续执行;
否则,算法结束,n就是最大公约数。
下面就是用“辗转相除法'才出并返回m、n最大公约数的函数fmn(),请填写清单中缺少的语句。
int fmn( m, n)
int m, n;
{ int r;
if(m<n )
{r=m;m=n;n=r;}
if(n==0)
return(m);
do{_________________
if(r!= 0)
{ m=n; n=r;}
}while(r!=0);
return(n);
}
分析由于算法步骤已经给出,按照算法来理解程序就比较简单。函数体开始的单分支语
句是确保m值是大于n值的。接下来的单分支语句是确保算法中的除法“m/n”时的除数n不为0。注意,如果一开始的n就是O,则两个最大公约数就是m,此处利用返回语句返回的函数值就是m。接下来的do-while循环是实现算法步骤中的第②步和第③步的,显然该循环体中的第2条单分支语句是完成算法步骤中的第③步工作的,而空白处应该完成算法步骤中的第②步工作,即r等于m/n的余数。
答案r=m%n;
说明求最大公约数和最小公倍数的算法是常用算法;但在教材中并没有给出,希望读者在
学有余力的情况下,能掌握这两个算法。
求两个正整数的最小公倍数的算法在教材中也没有给出,下面给出求最小公倍数的一种算法。设有两个正整数m、n,求它们的最小公倍数的算法如下:
①若m<n,则交换m和n(保证m大于n)。
②令d=m。
③若d能被n整除,则算法结束,d就是m和n的最小公倍数。
否则,令d=d+m,转第③步,继续执行。
实现算法的程序清单如下:
main()
{ int m, n, d ;
scanf("%d,%d",&m,&n);
if(m<n)
{ d=m;m=n;n=d;}
if(n==0)
d=0;
else
{ d=m;
while(d%n!=0)
d+=m;
}
printf(”%d\n”,d);
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)