形参和实参的定义
形参的定义
形参(形式参数)是函数定义中出现的参数,用于接收调用函数时传递的实际参数。形参可以看作是一个占位符,它在函数体内起到了变量的作用,用于处理传递进来的数据。
实参的定义
实参(实际参数)是函数调用时提供的具体值或变量。它用于传递给函数,以便函数在内部进行相应的计算和处理。实参与形参一一对应,形参接收实参的值,进而在函数内部使用。
形参和实参的区别
作用范围
形参作用范围仅限于函数内部,它在函数调用结束后就会被销毁。而实参可以是全局变量或局部变量,它的作用范围取决于它的定义位置。
存储方式
形参在函数调用时,会分配相应的内存空间来存储实参传递的值。实参是实际存在的变量或常量,其内存空间在传递给形参时不会改变,即实参和形参是不同的内存地址。
数据类型
形参的数据类型由函数定义时决定,实参的数据类型则需与形参的数据类型兼容,否则会产生编译错误。例如,如果函数形参是int类型,那么实参必须是int类型或能转换为int类型的数据。
函数调用时的参数传递
值传递
C语言默认采用值传递,即将实参的值复制一份传给形参。形参对该值进行操作时不会影响实参。
#include <stdio.h>
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10;
int y = 20;
swap(x, y);
printf("x = %d, y = %d\n", x, y); // 输出: x = 10, y = 20
return 0;
}
地址传递
通过指针可以实现地址传递,使函数操作直接影响实参。在这种情况下,形参为指针类型,实参传递的是变量的地址。
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10;
int y = 20;
swap(&x, &y);
printf("x = %d, y = %d\n", x, y); // 输出: x = 20, y = 10
return 0;
}
形参和实参在函数递归中的作用
在递归函数中,每次递归调用都会分配新的形参空间,独立于之前的调用。这意味着每次递归操作的实参都是独立的。
#include <stdio.h>
int factorial(int n) {
if (n == 0) return 1;
return n * factorial(n - 1);
}
int main() {
int number = 5;
printf("Factorial of %d is %d\n", number, factorial(number)); // 输出: Factorial of 5 is 120
return 0;
}
总结
综上所述,形参和实参在C语言中起到了不同的作用。形参是函数定义中的参数,实参是函数调用时提供的具体值。它们在作用范围、存储方式和数据类型上都有明显区别。值传递和地址传递是参数传递的两种主要方式,每种方式在不同场景下有着不同的应用。理解形参和实参的区别,对于掌握函数的使用和编写高效的C语言代码至关重要。