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; }