1、函数指针的基本概念
函数指针是一个指向函数的地址的指针。它的类型取决于函数的返回类型和参数类型。
定义语法:
return_type (*pointer_name)(parameter_types);
return_type
:函数的返回类型。
pointer_name
:函数指针的名称。
parameter_types
:函数的参数类型列表。
#include <stdio.h>
// 一个简单的函数,接受两个整数参数并返回它们的和
int add(int a, int b) {
return a + b;
}
// 声明一个函数指针
int (*func_ptr)(int, int);
int main() {
// 将函数指针指向函数 `add`
func_ptr = add;
// 使用函数指针调用 `add` 函数
int result = func_ptr(5, 3);
printf("Result of add(5, 3) using function pointer: %d\n", result);
return 0;
}
2、函数指针的初始化和调用
函数指针可以指向具有相同签名的函数(即相同的返回类型和参数类型),可以通过赋值将函数的地址赋给函数指针。
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
// 定义一个函数指针并指向函数 add
int (*func_ptr)(int, int) = add;
// 使用函数指针调用函数
int result = func_ptr(2, 3);
printf("Result: %d\n", result); // 输出 5
return 0;
}
3、函数指针的主要应用场景
1)回调函数
在某些应用中,程序可能需要调用用户定义的函数。例如,在排序函数中,可以使用回调函数来指定排序的比较方式。
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
int main() {
int arr[] = {5, 2, 9, 1, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
// 使用 qsort 函数,并传入函数指针 compare 作为比较函数
qsort(arr, n, sizeof(int), compare);
// 打印排序后的数组
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
2)函数表或跳转表
函数表是一种数组,用于存储函数指针。这种结构可以在运行时根据索引调用不同的函数。
#include <stdio.h>
void add(int a, int b) { printf("Addition: %d\n", a + b); }
void subtract(int a, int b) { printf("Subtraction: %d\n", a - b); }
void multiply(int a, int b) { printf("Multiplication: %d\n", a * b); }
int main() {
// 定义一个函数指针数组
void (*operations[])(int, int) = {add, subtract, multiply};
int a = 10, b = 5;
for (int i = 0; i < 3; i++) {
operations[i](a, b); // 调用不同的操作函数
}
return 0;
}
4、指向不同签名函数的函数指针
函数指针的类型必须与其指向的函数的签名匹配,即返回类型和参数类型必须相同。否则会导致未定义行为。
#include <stdio.h>
void my_function(int x) {
printf("Value: %d\n", x);
}
int main() {
// 错误:函数指针的签名不匹配
int (*func_ptr)(int) = my_function; // my_function 返回 void,但 func_ptr 期望 int 返回类型
return 0;
}
5、函数指针的返回类型
函数指针也可以用作函数的返回类型,函数可以返回一个指向其他函数的指针。这在创建函数工厂或动态选择操作时非常有用。
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
// 返回指向函数的指针
int (*get_operation(char op))(int, int) {
if (op == '+') return add;
if (op == '-') return subtract;
return NULL;
}
int main() {
int (*operation)(int, int);
operation = get_operation('+');
if (operation) {
printf("Result: %d\n", operation(5, 3)); // 输出 8
}
return 0;
}