C语言 形式参数和实际参数
函数中的参数有两种,形式参数,简称形参;实际参数,简称实参。主调函数调用被调函数时的数据传递是通过实参数据传递给形参来实现的。
©形式参数:定义函数时使用的参数,只能在该函数体内使用。
©实际参数:引用函数时使用的参数。
当发生函数调用时,主调函数把实参的值复制一份,传送给被调用函数的形参,从而实现主调函数向被调用函数的数据传送。
【例题】实参到形参的数据传递
程序如下:
#include<stdio.h>
int sum(int x,int y) /* 定义函数,形参为x,y */
{
x=x+y;
y=x+y;
return x;
}
void main()
{
int a=l,b=3,c;
c=sum(a.b); /* 调用函数,并将实参a, b值传递过去 */
printf("sum of %d,%d is %d\n",a,b,c);
}
程序执行后,输出结果为:
sum of 1,3 is 4
①程序执行时,当执行到c=sum(a,b);语句时,执行函数调用,同时为函数sum()的形参X、y分配内存空间。
②计算实参a、b的值传递给形参x、y; x得到值1, y得到值3。
③执行函数sum()的语句,通过计算变量x的值变为4,变量y的值变为7。
④执行遇到return语句,函数执行结束,将变量x的值作为函数值带回。同时,释放函数sum()中定义的变量(包括形参x、y)所分配的内存空间。
说明:
①形式参数只有当函数被调用时才被分配相应的内存,调用结束后立即释放所分配的内存单元。因此,形参只在本函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。
②实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便向对应的形参标识的内存单元传递数据。应预先用实参变量、赋值计算等办法,使实参获得确定的值。形参则只能是变量,不能是一个表达式。例如以下语句是正确的:
c=sum( 3+2,7);
执行时先将3+2计算出来,之后赋给形参变量X。
③实参与形参必须个数相同。
④对应的形参和实参的类型必须一致。
⑤C语言中,函数调用时数据传递是值传递的形式。也就是说只能将实参的值单向传递给形参,而形参所做的改变不能带回调用函数。因为,实参和形参在内存中占据不同的内存空间。上述中,对形参变量y的值经过计算变成7,但y的值无法带回,所以实参b的值仍为3。例如:有人试图编写一个 函数实现两个变量的交换,程序如下:
void swap(int m,int n)
{
int t;
t=m;
m=n;
n=t;
}
main()
{
int a=3,b=5;
swap(a,b);
printf ("after swap:\n");
printf("%a=d b=%d\n",a,b);
}
编程者本意是想在swap()函数中实现变量交换,之后将交换后的结果带回到main()函数,但由于C语言中实参到形参是单向传递的,所以程序执行后,输出结果为:
after swap:
a=3 b=5
可见,形参的改变并没有影响到实参。
⑥定义函数时,形参不占内存空间,只有当函数被调用时,才为形参分配内存空间,接收由实参传递来的值。因实参和形参占用不同的内存单元,即使实参与形参同名也互不影响。
例如:
void fun(int a)
{
int d=2;
a=d++;
printf("%d ",a);
}
main()
{
int a=1;
fu(a);
printf(%d \n",a);
}
程序执行,输出结果为:
2 1
程序中,形参变量名为a,实参变量名也为a,虽然变量名相同,但他们占据的是不同的内存单元,形参变量a只有在函数被调用才会被分配内存空间,得到从实参传递过来的数据,而在函数执行期间,main()函数中的变量a也不能再使用。当函数调用结束,形参所占内存空间随即被释放。
点击加载更多评论>>