C语言形参和实参的区别是什么(附带实例)
C语言程序中使用函数时,经常会用到形式参数(简称形参)和实际参数(简称实参)。二者都叫作参数,对于它们之间的区别,下面将通过形参与实参的名称和作用来进行讲解,并会通过比喻进行深入介绍。
1) 通过名称理解:
2) 通过作用理解:
例如,我们定义一个选择午餐吃什么的函数,如下图所示:
自定义的函数中的 lunch 是形参,而主函数中的 eat1 和 eat2 是实参。
3) 通过比喻来理解形参和实参。定义函数时列表的参数就是形式参数,而调用函数时传递进来的参数就是实际参数,就像选剧本主角一样,剧本的角色相当于形式参数,而扮演角色的演员就相当于实际参数。
2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
请看下面的例子:
从运行情况看,输入 a 值为 1,即实参 a 的值为 1,把这个值传递给函数 sum() 后,形参 m 的初始值也为 1,在函数执行过程中,形参 m 的值变为 5050。函数运行结束后,输出实参 a 的值仍为 1,可见实参的值不会随形参的变化而变化。
以上调用 sum() 时是将变量作为函数实参,除此以外,你也可以将常量、表达式、函数返回值作为实参,如下所示:
5) 形参和实参虽然可以同名,但它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。
更改上面的代码,让实参和形参同名:
1) 通过名称理解:
- 形参:按照其名称进行理解就是形式上存在的参数;
- 实参:按照其名称进行理解就是实际存在的参数。
2) 通过作用理解:
- 形参:在定义函数时,函数名后面括号中的变量为形式参数。在调用函数之前,传递给函数的值将被复制到这些形式参数中;
- 实参:在调用函数时,也就是真正使用函数时,函数名后面括号中的参数为实际参数。
例如,我们定义一个选择午餐吃什么的函数,如下图所示:

自定义的函数中的 lunch 是形参,而主函数中的 eat1 和 eat2 是实参。
3) 通过比喻来理解形参和实参。定义函数时列表的参数就是形式参数,而调用函数时传递进来的参数就是实际参数,就像选剧本主角一样,剧本的角色相当于形式参数,而扮演角色的演员就相当于实际参数。
C语言形参和实参的区别和联系
1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
请看下面的例子:
#include <stdio.h> //计算从m加到n的值,m、n 都是形参 int sum(int m, int n) { int i; for (i = m+1; i <= n; ++i) { m += i; } return m; } int main() { int a, b, total; printf("Input two numbers: "); scanf("%d %d", &a, &b); total = sum(a, b); //a、b 是实参 printf("a=%d, b=%d\n", a, b); printf("total=%d\n", total); return 0; }运行结果:
Input two numbers: 1 100↙
a=1, b=100
total=5050
从运行情况看,输入 a 值为 1,即实参 a 的值为 1,把这个值传递给函数 sum() 后,形参 m 的初始值也为 1,在函数执行过程中,形参 m 的值变为 5050。函数运行结束后,输出实参 a 的值仍为 1,可见实参的值不会随形参的变化而变化。
以上调用 sum() 时是将变量作为函数实参,除此以外,你也可以将常量、表达式、函数返回值作为实参,如下所示:
total = sum(10, 98); //将常量作为实参 total = sum(a+10, b-3); //将表达式的结果作为实参 total = sum( pow(2,2), abs(-100) ); //将函数返回值作为实参
5) 形参和实参虽然可以同名,但它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。
更改上面的代码,让实参和形参同名:
#include <stdio.h> //计算从m加到n的值 int sum(int m, int n) { int i; for (i = m + 1; i <= n; ++i) { m += i; } return m; } int main() { int m, n, total; printf("Input two numbers: "); scanf("%d %d", &m, &n); total = sum(m, n); printf("m=%d, n=%d\n", m, n); printf("total=%d\n", total); return 0; }运行结果:
Input two numbers: 1 100↙
m=1, n=100
total=5050