本章目录:
前言
在 C 语言中,函数指针是一个强大而灵活的工具,它不仅能实现函数的动态调用,还可以通过回调机制大幅降低程序的耦合度。本文将通过通俗易懂的讲解、详细的实例和关键技术点的梳理,帮助你全面掌握函数指针及其在回调函数中的应用。
什么是函数指针?
定义
函数指针是指向函数的指针变量。它允许我们通过指针来调用函数或将函数作为参数传递。
声明方式
以下是函数指针的一种常见声明方式:
c
typedef int (*fun_ptr)(int, int); // 声明一个指向两个整数参数且返回整数的函数指针类型
函数指针的基本用法
示例:最大值函数
我们来看一个简单的示例,通过函数指针调用 max
函数:
c
#include <stdio.h>
int max(int x, int y) {
return x > y ? x : y;
}
int main(void) {
// 声明函数指针并赋值
int (*p)(int, int) = max;
int a, b, c, d;
printf("请输入三个数字: ");
scanf("%d %d %d", &a, &b, &c);
// 使用函数指针调用函数
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d);
return 0;
}
输出示例:
bash
请输入三个数字: 1 2 3
最大的数字是: 3
提示 :函数指针在赋值时
&
符号可省略,例如p = max
。
回调函数与函数指针
什么是回调函数?
一个回调函数是通过函数指针调用的函数。它通常被用作其他函数的参数,在特定事件发生时被调用。
通俗解释
假设你在商店里需要订购商品。店员会记录下你的电话号码(回调函数),当商品到货时,店员会给你打电话(调用回调函数),然后你去取货(响应事件)。
函数指针 = 电话 ,回调函数名称 = 电话号码。
示例:回调函数实现动态数组填充
以下示例演示如何使用函数指针动态填充数组:
c
#include <stdlib.h>
#include <stdio.h>
// 填充数组的函数,第三个参数是函数指针
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) {
for (size_t i = 0; i < arraySize; i++) {
array[i] = getNextValue();
}
}
// 回调函数:获取随机值
int getNextRandomValue(void) {
return rand();
}
int main(void) {
int myArray[10];
// 使用回调函数填充数组
populate_array(myArray, 10, getNextRandomValue);
for (int i = 0; i < 10; i++) {
printf("%d ", myArray[i]);
}
printf("\n");
return 0;
}
输出示例:
bash
16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709
进一步探索:带参回调函数
有时回调函数需要接受参数,以下示例展示了如何实现这一功能:
c
#include <stdio.h>
// 两个整数求和的函数
int sum(int a, int b) {
return a + b;
}
// 回调函数:对 sum 的结果乘以系数
int sum_with_multiplier(int multiplier, int (*callback)(int, int), int x, int y) {
return multiplier * callback(x, y);
}
int main(void) {
// 定义回调函数指针
int (*callback)(int, int) = sum;
printf("SUM = %d\n", callback(1, 2));
printf("SUM with multiplier = %d\n", sum_with_multiplier(2, callback, 1, 2));
return 0;
}
输出示例:
bash
SUM = 3
SUM with multiplier = 6
函数指针的进阶技巧
函数指针数组
函数指针可以存储在数组中,用于动态选择和调用多个函数:
c
#include <stdio.h>
void printHello() {
printf("Hello\n");
}
void printWorld() {
printf("World\n");
}
int main(void) {
// 定义函数指针数组
void (*functions[2])() = {printHello, printWorld};
// 调用数组中的函数
functions[0](); // 输出 "Hello"
functions[1](); // 输出 "World"
return 0;
}
返回函数指针的函数
函数也可以返回一个函数指针:
c
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int (*getAddFunction())(int, int) {
return add;
}
int main(void) {
// 获取函数指针
int (*addFunc)(int, int) = getAddFunction();
printf("Result: %d\n", addFunc(3, 4));
return 0;
}
输出示例:
bash
Result: 7
总结
- 函数指针 是 C 语言中用来指向函数的特殊指针,它可以调用函数、作为参数传递,并实现动态选择。
- 回调函数 是函数指针的核心应用,它通过解耦逻辑提高了代码的灵活性。
- 高阶技巧 如函数指针数组、返回函数指针的函数等,为程序提供了更多的动态功能。
掌握函数指针和回调函数,可以让你的 C 语言编程能力迈上一个新台阶!