C语言函数的形参和实参(非常详细,附带实例)
在 C语言程序中,函数通常接收一些数据,执行某些操作,然后返回一个结果。比如,C语言标准库中的 printf() 就是一个函数,它接收我们要输出的内容,并在屏幕上显示出来。
函数接收数据是借助形参(形式参数)和实参(实际参数)实现的,简单来说:
- 形参:是函数定义时声明的参数,出现在函数的括号中。它们是函数内部的局部变量,作用是接收调用时传入的数据;
- 实参:是函数调用时实际传入的具体值或表达式,出现在函数调用的括号中。它们是形参的“来源”。
形参和实参的基本用法
让我们通过一个简单的例子来看看形参和实参如何工作:
#include <stdio.h>
int add(int a, int b) { // a 和 b 是形参
return a + b;
}
int main() {
int x = 3, y = 5;
int sum = add(x, y); // x 和 y 是实参
printf("Sum = %d\n", sum);
return 0;
}
输出结果:
Sum = 8
在这个例子中:
-
int a, int b是形参,定义在函数 add() 的括号中,表示函数需要两个整数参数。 -
x和y是实参,在调用 add(x, y) 时传入,分别是变量 x 和 y 的值 3 和 5。
形参 a 和 b 在函数内部接收了实参的值,计算后返回结果。
形参和实参的匹配规则
在 C语言中,形参和实参之间有一些严格的匹配规则,确保函数能够正确工作。具体要求如下:
1. 数量匹配:形参和实参的个数必须一致。 2. 类型匹配:实参的类型应与形参的类型一致,或者能够自动转换为形参类型。 3. 顺序匹配:实参的顺序必须与形参的顺序对应。
例如,如果函数定义了两个形参,而调用时只传入一个实参,编译器会报错。
来看一个错误的例子:
int add(int a, int b) { return a + b; }
int main() { add(5); } // 错误:缺少一个实参
再看一个类型不匹配的例子:
#include <stdio.h>
void printNumber(int n) {
printf("Number: %d\n", n);
}
int main() {
printNumber("Hello"); // 类型不匹配:字符串无法自动转为整数
return 0;
}
这里会导致编译错误或未定义行为,因为字符串无法直接作为整数传入。
实参的多样性
实参不仅可以是变量,还可以是常量、表达式,甚至其他函数的调用结果。例如:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
printf("Sum = %d\n", add(3, 4)); // 常量作为实参
printf("Sum = %d\n", add(2 + 1, 5)); // 表达式作为实参
printf("Sum = %d\n", add(add(1, 2), 3)); // 函数调用结果作为实参
return 0;
}
输出结果:
Sum = 7 Sum = 8 Sum = 6这些实参在传入时会被计算为具体的值,然后赋值给形参。C语言的灵活性使得函数调用非常强大。
函数参数的值传递
C语言中,形参和实参之间的数据传递采用的是值传递(Pass by Value)。这意味着,实参的值会被复制一份给形参,函数内部对形参的修改不会影响实参的原始值。
来看一个例子:
#include <stdio.h>
void change(int x) {
x = 10;
}
int main() {
int a = 5;
change(a);
printf("a = %d\n", a);
return 0;
}
输出结果:
a = 5
在这个例子中,a 是实参,值是 5。调用 change(a) 时,a 的值被复制给形参 x。函数内部将 x 改为 10,但这只是修改了 x 的副本,a 的值依然是 5。
这种机制的好处是保护了原始数据,但如果确实需要修改实参,可以通过指针实现。这时,实参是变量的地址,形参是指针类型。来看一个例子:
#include <stdio.h>
void swap(int *x, int *y) {
int temp = *x;
*x = *y;
*y = temp;
}
int main() {
int a = 3, b = 5;
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
输出结果:
a = 5, b = 3
在这里,实参 &a 和 &b 是变量的地址,形参 x 和 y 是指针。函数通过解引用操作 *x 和 *y,直接修改了 a 和 b 的值。
形参和实参的常见问题
下面是新手小白学习函数形参和实参过程中经常遇到的问题。
1) 形参名和实参名可以一样吗?
形参和实参的名称可以相同,但没必要。形参是函数内部的局部变量,与实参的名称无关。
ICP备案:
公安联网备案: