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) 形参名和实参名可以一样吗?
形参和实参的名称可以相同,但没必要。形参是函数内部的局部变量,与实参的名称无关。