在C语言中,函数可以作为形参使用,通过函数指针来实现。
### 使用方法
一般形式为 `func(T (*func)(V args))`,使用时直接使用对应参数类型的函数名即可。函数的名字就是指向内存中函数开始执行位置的指针,因此可以直接进行赋值。通过传入不同函数作为参数,能调用不同函数实现不同的功能。
以下是一个示例代码:
```c
#include <stdio.h>
// 定义一个函数,用于从数组中选择最大元素
int select_max(int numArray[10]) {
int iMax = numArray[0];
int i = 0;
for (i = 0; i < 10; i++) {
if (iMax < numArray[i]) {
iMax = numArray[i];
}
}
return iMax;
}
// 定义一个函数,用于从数组中选择最小元素
int select_min(int numArray[10]) {
int iMin = numArray[0];
int i = 0;
for (i = 0; i < 10; i++) {
if (iMin > numArray[i]) {
iMin = numArray[i];
}
}
return iMin;
}
// 定义一个函数,接收数组和函数指针作为参数
int select(int numArray[10], int (*func)(int[])) {
return func(numArray);
}
int main() {
int array[10] = {1, 3, 2, 4, 0, 9, 8, 5, 6, 7};
// 调用select函数,传入select_max函数
printf("max number of array is :%d\n", select(array, select_max));
// 调用select函数,传入select_min函数
printf("min number of array is :%d\n", select(array, select_min));
return 0;
}
```
该示例中,`select` 函数接收一个数组和一个函数指针作为参数,通过传入不同的函数(`select_max` 或 `select_min`),可以实现不同的功能(选择最大值或最小值)[^4]。
### 原理
C语言中,函数名代表函数的入口地址,也就是一个指针。当把函数作为形参时,实际上传递的是函数的地址,通过函数指针来调用该函数。
下面是另一个使用函数指针将函数名(函数的地址)作为参数传递的例子:
```c
#include <stdio.h>
// 定义一个函数类型,该函数接收两个int参数,返回int
typedef int (*FuncPtr)(int, int);
// 一个简单的加法函数
int add(int a, int b) {
return a + b;
}
// 一个简单的减法函数
int subtract(int a, int b) {
return a - b;
}
// 调用传入的函数指针指向的函数
int operate(FuncPtr func, int x, int y) {
return func(x, y);
}
int main() {
// 声明函数指针变量,并分别指向add和subtract函数
FuncPtr addFunc = add;
FuncPtr subtractFunc = subtract;
// 调用operate函数,传入不同的函数指针
printf("5 + 3 = %d\n", operate(addFunc, 5, 3));
printf("5 - 3 = %d\n", operate(subtractFunc, 5, 3));
// 也可以直接在调用时传递函数名(实际上是传递函数的地址)
printf("10 + 2 = %d\n", operate(add, 10, 2));
printf("10 - 2 = %d\n", operate(subtract, 10, 2));
return 0;
}
```
在这个例子中,`operate` 函数接收一个函数指针 `FuncPtr` 作为参数,通过传入不同的函数指针(`addFunc`、`subtractFunc` 或直接传入函数名),可以调用不同的函数实现加法或减法运算 [^3]。