学霸联盟 放下老师出品 C语言高级编程 值传递与引用传递
1.什么是形参和实参
形参(形式参数)
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
2.功能
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
3.形参和实参的区别和联系
-
形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
-
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
-
实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
-
函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
4.示例代码
这儿演示数组作为形参
int test(int a[])
{
printf("测试数组长度:%d\n", sizeof(a) / sizeof(int));
return 0;
}
int main()
{
int a[] = { 1,2,3,4,5,6,7,8 };
printf("实际数组长度:%d\n", sizeof(a) / sizeof(int));
test(a);
return 0;
}
很显然数组作为形参测试结果是错误的,这是因为数组作为形参相当于指针,传入的是第一个数组元素的地址,指针长度为4字节,再/sizeof(int)后为1。所以我们尽量不要把数组作为形参。
大家还可以参考一下值传递、引用传递、指针传递。