最近在做题的时候被问到了形参和实参的区别,所以在这具体解释一下。
首先什么是形参?什么是实参?
形参(形式参数)
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
形参和实参的区别和联系
-
形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
-
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
-
实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
-
函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
接下来看几个例子:
#include<stdio.h>
void swap(int a, int b);//函数声明
int main()
{
int x = 7, y = 11;
printf("实参x、y的初值为:x=%d y=%d\n\n", x, y);
swap(x, y);//调用时把下实参x,y的值传递给形参a,b
printf("实参x、y交换后的值为:x=%d y=%d\n\n", x, y);
//printf("x、y交换后的值为:x=%d y=%d\n\n", a, b);//报错,因为形参只能在调用函数范围内使用,不能再函数外部使用
return 0;
}
//函数定义,这里括号中的a和b就是形参
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
printf("形参a=%d 形参b=%d\n\n", a, b);
}
输出结果如下:
这个例子说明了实参只是向形参传递其本身的数值,形参变量只是在void swap()这个函数里有效,调用这个函数结束后会立即释放内存,同时形参的值改变不会影响实参。
而且!!!
形参和实参可以同名!!!,因为它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。所以这个更能说明形参的改变影响不了实参的值。
同样上面的例子
#include<stdio.h>
void swap(int x, int y);//函数声明
int main()
{
int x = 7, y = 11;
printf("实参x、y的初值为:x=%d y=%d\n\n", x, y);
swap(x, y);//调用时把下实参x,y的值传递给形参a,b
printf("实参x、y交换后的值为:x=%d y=%d\n\n", x, y);
//printf("x、y交换后的值为:x=%d y=%d\n\n", x, y);//不报错,但这里输出的还是实参的值
return 0;
}
//函数定义,这里括号中的a和b就是形参
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
printf("形参x=%d 形参y=%d\n\n", x, y);
}