C 函数指针的一个主要用途是回调函数。当一个函数需要调用一个在其它程序模块定义的函数时,可以使用函数指针来调用该函数。另外,有时候在定义一个函数的时候,不确定该函数的一些细节,比如参数的数据类型,遇到这种情况,可以把函数参数定义成函数指针类型,然后再调用的时候,通过传递不同的函数指针调用该函数。
一个常见的例子就是在 GTK+ 等图形库中,当用户触发某个事件后,程序会调用预设的函数,并通过函数指针参数传递事件的详细信息。
C 函数指针还可以用于实现函数回调。函数回调就是在函数执行完后,跳转到一个指定函数继续执行。在实际应用中,我们可以指定一个函数,在指定事件触发时自动执行回调函数。
下面是一个简单的例子:
```
#include
void callback(int i)
printf("callback %d\n", i);
void execute(void (*callback_func)(int))
for(int i = 0; i < 3; i++)
{
callback_func(i);
}
int main()
execute(callback);
return 0;
```
在这个例子中,execute 函数以函数指针的形式接受一个回调函数作为参数,并执行该回调函数。在主函数中,我们将一个名为callback的函数传递给execute函数作为回调函数,然后执行execute函数。当execute函数中调用回调函数callback时,它们都是使用callback函数的代码,这就是函数回调的实现。
在函数参数列表中,可以传递函数指针参数。在程序运行时,可以根据传递的函数指针参数执行不同的函数。
下面是一个例子:
```
#include
void sum(int a, int b)
printf("%d + %d = %d\n", a, b, a + b);
void dif(int a, int b)
printf("%d - %d = %d\n", a, b, a - b);
void execute(int (*fun)(int, int), int a, int b)
fun(a, b);
int main()
execute(sum, 2, 3);
execute(dif, 2, 3);
return 0;
```
在这个例子中,execute函数接受函数指针作为参数,并根据传递给该函数的函数指针参数来调用不同的函数。在main函数中,首先调用execute函数,传递sum函数指针作为参数,然后使用该函数指针参数调用sum函数。接着,再次调用execute函数,但是这次传递了dif函数指针作为参数,根据这个参数,调用了dif函数。
C 函数指针可以与回调函数一起使用,用于实现灵活的、可扩展的回调函数。例如:
```
#include
typedef int (*CalculationFunction)(int, int);
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int main()
CalculationFunction calculation_function;
calculation_function = add;
printf("1 + 2 = %d\n", calculation_function(1, 2));
calculation_function = subtract;
printf("1 - 2 = %d\n", calculation_function(1, 2));
return 0;
```
在这个例子中,我们定义了一个名为 CalculationFunction 的函数类型,它接受两个整数参数并返回一个整数。然后,我们定义了两个函数 add 和 subtract,它们与 CalculationFunction 类型匹配。
在主函数中,我们使用 CalculationFunction 类型的变量 calculation_function 来引用这两个函数。我们首先将 add 函数的地址赋值给 calculation_function,然后调用该函数。接着,我们将 subtract 函数的地址赋给 calculation_function,再次调用计算函数。
总之,C 函数指针在很多情况下是非常有用的工具,可以使代码更加灵活、可扩展、可重用。