函数指针详解
函数指针详解
函数指针是C/C++中非常重要的概念,它允许程序在运行时动态地调用不同的函数。
1. 基本概念
函数指针是指向函数的指针变量,它存储的是函数的入口地址。
2. 函数指针的声明
基本语法
返回类型 (*指针变量名)(参数类型列表);
示例
// 声明一个指向函数的指针,该函数无参数,返回int int (*func_ptr)(void); // 声明一个指向函数的指针,该函数有两个int参数,返回int int (*operation)(int, int); // 声明一个指向函数的指针,该函数有char*参数,返回void void (*print_func)(char*);
3. 函数指针的使用
基本用法示例
4. 函数指针的初始化
多种初始化方式
5. 函数指针作为参数
回调函数示例
6. 函数指针作为返回值
函数工厂模式
7. 使用typedef简化函数指针
typedef用法
#include <stdio.h> // 使用typedef定义函数指针类型 typedef int (*MathOperation)(int, int); typedef void (*PrintFunction)(char*); // 函数实现 int add(int a, int b) { return a + b; } int multiply(int a, int b) { return a * b; } void print_upper(char* str) { while (*str) { putchar(toupper(*str++)); } putchar('\n'); } int main() { // 使用typedef后的声明更简洁 MathOperation op1 = add; MathOperation op2 = multiply; PrintFunction printer = print_upper; printf("加法: %d\n", op1(5, 3)); printf("乘法: %d\n", op2(5, 3)); printer("hello world"); return 0; }
8. 函数指针数组
命令表模式
使用简化模式方便查看,通常情况下的使用如下
声明 含义 unsigned char *fun(void) 函数,返回 unsigned char* unsigned char (*fun)(void) 函数指针,指向返回 unsigned char 的函数 unsigned char (*fun[])(void) 函数指针数组 unsigned char (*const fun[])(void) 常量函数指针数组
// 命令处理器表 void (*commands[])(void) = { cmd_help, cmd_start, cmd_stop, cmd_status, NULL // 结束标记 }; // 状态机处理函数表 void (*state_handlers[])(void) = { state_idle, state_running, state_paused, state_error };
9. 实际应用场景
场景1:排序算法选择
#include <stdio.h>
#include <stdlib.h>
typedef int (*CompareFunc)(const void*, const void*);
// 不同的比较函数
int ascending(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
int descending(const void* a, const void* b) {
return (*(int*)b - *(int*)a);
}
void sort_array(int arr[], int size, CompareFunc compare) {
qsort(arr, size, sizeof(int), compare);
}
int main() {
int numbers[] = {5, 2, 8, 1, 9};
int size = sizeof(numbers) / sizeof(numbers[0]);
printf("原数组: ");
for (int i = 0; i < size; i++) printf("%d ", numbers[i]);
printf("\n");
// 升序排序
sort_array(numbers, size, ascending);
printf("升序排序: ");
for (int i = 0; i < size; i++) printf("%d ", numbers[i]);
printf("\n");
// 降序排序
sort_array(numbers, size, descending);
printf("降序排序: ");
for (int i = 0; i < size; i++) printf("%d ", numbers[i]);
printf("\n");
return 0;
}
场景2:状态机实现
#include <stdio.h>
typedef void (*StateHandler)();
void state_idle() { printf("空闲状态 - 等待命令\n"); }
void state_processing() { printf("处理状态 - 正在工作\n"); }
void state_error() { printf("错误状态 - 需要处理错误\n"); }
int main() {
StateHandler current_state = state_idle;
int input;
while (1) {
current_state();
printf("输入状态 (0:空闲, 1:处理, 2:错误, -1:退出): ");
scanf("%d", &input);
if (input == -1) break;
switch (input) {
case 0: current_state = state_idle; break;
case 1: current_state = state_processing; break;
case 2: current_state = state_error; break;
default: printf("无效输入\n");
}
}
return 0;
}
10. 注意事项
类型安全
// 错误的函数指针赋值
void func_void(void) { }
int func_int(int) { return 0; }
// 以下会导致编译错误或未定义行为
// void (*wrong_ptr)(void) = func_int; // 错误:类型不匹配
// int (*wrong_ptr2)(int) = func_void; // 错误:类型不匹配
空指针检查
#include <stdio.h>
int add(int a, int b) { return a + b; }
int main() {
int (*func_ptr)(int, int) = NULL;
// 在使用前检查指针是否为空
if (func_ptr != NULL) {
func_ptr(1, 2); // 安全调用
} else {
printf("函数指针为空!\n");
}
// 正确赋值后使用
func_ptr = add;
if (func_ptr) { // 简写的空指针检查
printf("结果: %d\n", func_ptr(3, 4));
}
return 0;
}
总结
函数指针是C/C++中强大的特性,主要用于:
-
回调函数机制
-
策略模式实现
-
命令模式
-
状态机
-
动态函数选择
-
插件架构
掌握函数指针可以让你写出更加灵活和可扩展的代码!
浙公网安备 33010602011771号