三、参数传递
如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品;从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值。
C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。
形参(形式参数)
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
形参和实参的区别和联系
1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
C 语言中的参数传递方式有两种
值传递和引用传递。值传递是指将实参的值传递给形参,形参是实参的副本,在函数内部对形参的修改不会影响实参的值。引用传递是指将实参的地址传递给形参,形参是实参的别名,在函数内部对形参的修改会影响实参的值。
引用传递
例如下面这个交换函数,作用为交换两个整数
1. #include<stdio.h> 2. void jiaohuan(int* pa, int* pb) 3. { 4. int c = *pa; 5. *pa = *pb; 6. *pb = c; 7. } 8. int main() 9. { 10. int a = 0; 11. int b = 0; 12. scanf("%d %d", &a, &b); 13. printf("交换前a=%d,b=%d\n", a, b); 14. jiaohuan(&a, &b); 15. printf("交换后a=%d,b=%d\n", a, b); 16. return 0; 17. }
运行结果为:
在调用 jiaohuan() 函数时,可以传递两个变量的地址作为实参,这样在函数内部就可以通过指针修改变量的值,这里的pa相当于&a,pb相当于&b;这里传递了地址,而当只传递值时
值传递
还是用交换函数
1. /void Swap(int x, int y) 2. //{ 3. // int tmp = x; 4. // x = y; 5. // y = tmp; 6. //} 7. // 8. //int main() 9. //{ 10. // int a = 0; 11. // int b = 0; 12. // scanf("%d %d", &a, &b); 13. // 14. // printf("交换前:a=%d b=%d\n", a, b); 15. // //实际参数 - 实参 16. // //当实参传递给形参的时候 17. // //形参是实参的一份临时拷贝 18. // //所以对形参的修改不会影响实参 19. // // 20. // Swap(a, b); 21. // printf("交换后:a=%d b=%d\n", a, b); 22. // 23. // return 0; 24. //}
在调用Swap()函数时,可传递两个变量的值作为实参,而这里实参传递给形参的时候,形参是实参的一份零时拷贝,所以对形参的修改不会影响实参。
运行结果如下:
可以看到交换前后a与b的值并未发生变化 ,这里就与前面所提到形参变量有关了, 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效。
这里我们对所传递的值进行监视得a与x 、b与y的地址并不同,而且调用结束后,还会立即释放内存,所以并不会实参产生影响!
综上所述,二者区别为:
以上就是我现在对C语言函数的初步理解,若有不正确或不全面的地方,欢迎各位友友指出,博主一定会改正加油的。