【C语言】-指针04(函数指针)

0、前言

在 C 语言中,函数指针是指向函数的变量,它可以存储函数的地址并在运行时调用函数。函数指针为 C 语言提供了极大的灵活性,是实现回调函数、动态调用和多态的关键机制。

1、函数指针基础知识

1.1、函数指针的声明和初始化

// 声明语法:返回类型 (*指针名)(参数列表)
int (*add)(int, int);  // 声明一个指向返回int、接受两个int参数的函数指针
int* add(int,int);		/* 声明一个指向返回int*、接受两个int参数的函数 */

// 初始化(指向具体函数)
int sum(int a, int b) { return a + b; }
add = sum;  // 或 add = ∑(&可选)

1.2、通过函数指针调用函数

int result = (*add)(3, 4);  // 显式解引用调用
// 或简化为(C语言支持直接通过指针调用)
int result = add(3, 4);     // 隐式解引用调用

1.3、函数指针作为回调函数

void apply(int (*func)(int), int x) {
    printf("Result: %d\n", func(x));  // 调用传入的函数
}

int square(int n) { return n * n; }

// 调用示例
apply(square, 5);  // 输出25

1.4、函数指针数组

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int (*operations[2])(int, int) = {add, sub};  // 函数指针数组

// 调用示例
int result = operations[0](5, 3);  // 调用add(5,3)

2、函数指针的常见应用场景

2.1、回调函数(Callback)

将函数作为参数传递,由其他函数在特定时机调用。

// 标准库qsort函数的原型
void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

// 自定义比较函数
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

// 使用回调
qsort(array, 10, sizeof(int), compare);

2.2、实现状态机

根据不同状态实现不同的操作。

void state_init(void);
void state_run(void);
void state_shutdown(void);

void (*state_handlers[])(void) = {state_init, state_run, state_shutdown};

// 根据状态调用对应函数
state_handlers[current_state]();

2.3、动态函数调用

根据用户输入或运行时条件选择调用函数。

int (*math_func)(int, int);

if (operation == '+') {
    math_func = add;
} else if (operation == '-') {
    math_func = sub;
}

int result = math_func(10, 5);  // 动态调用

2.4、接口封装(模拟多态)

不同模块实现相同接口,通过函数指针调用。

typedef struct {
    void (*init)(void);
    void (*process)(int data);
} DeviceInterface;

void deviceA_init(void);
void deviceA_process(int data);

DeviceInterface deviceA = {deviceA_init, deviceA_process};

// 使用接口调用函数
deviceA.init();
deviceA.process(42);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值