C语言中,函数名本身就代表了函数的入口地址。可以将函数的地址赋值给一个指针变量,这个指针变量就称为函数指针。通过函数指针,可以间接调用函数。

1、将函数作为参数传递

将函数作为参数传递给另一个函数,实际上就是将函数指针作为参数传递。这样,被调用的函数就可以根据传入的函数指针来调用不同的函数。

#include <stdio.h>

// 一个简单的函数,计算两个整数的和
int add(int a, int b) {
    return a + b;
}

// 另一个函数,计算两个整数的差
int subtract(int a, int b) {
    return a - b;
}

// 接受一个函数指针作为参数的函数
void operate(int a, int b, int (*operation)(int, int)) {
    int result = operation(a, b);  // 调用传入的函数
    printf("Result: %d\n", result);
}

int main() {
    int x = 5, y = 3;
    
    // 将 add 函数作为参数传递给 operate
    operate(x, y, add);  // 输出 Result: 8

    // 将 subtract 函数作为参数传递给 operate
    operate(x, y, subtract);  // 输出 Result: 2

    return 0;
}

2、函数指针的声明和使用

函数指针是指向函数的指针变量。就像普通指针指向变量一样,函数指针指向函数。通过函数指针,我们可以间接调用函数,实现函数的动态绑定。

1)函数指针的声明

函数指针的声明格式如下,

return_type (*pointer_name)(parameter_types);

return_type 是函数返回值的类型

pointer_name 是指针的名称

parameter_types 是函数的参数类型

2)将函数指针作为参数传递给另一个函数

#include <stdio.h>

// 定义一个函数,返回int,接受两个int参数
int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

// 定义一个函数,接受一个函数指针作为参数
// 该指针指向一个接受两个int参数并返回int的函数
int operate(int a, int b, int (*operation)(int, int)) {
    return operation(a, b);
}

int main() {
    int x = 10, y = 5;

    // 将 add 函数作为参数传递给 operate 函数
    printf("Add: %d\n", operate(x, y, add));

    // 将 subtract 函数作为参数传递给 operate 函数
    printf("Subtract: %d\n", operate(x, y, subtract));

    return 0;
}

3、复杂的函数指针

可以让函数指针指向一个返回 void 的函数。

#include <stdio.h>

// 计算并输出两个数的和
void print_sum(int a, int b) {
    printf("Sum: %d\n", a + b);
}

// 接受函数指针作为参数
void execute(void (*func)(int, int), int a, int b) {
    func(a, b);  // 调用传入的函数
}

int main() {
    int x = 5, y = 3;
    execute(print_sum, x, y);  // 输出 Sum: 8
    return 0;
}

4、返回函数指针

函数可以返回函数指针,可以通过这种方式返回一个指向函数的指针,并在其他地方使用它。

#include <stdio.h>

// 返回一个指向函数的指针
int (*get_operator(char op))(int, int) {
    if (op == '+') {
        return add;
    } else if (op == '-') {
        return subtract;
    } else {
        return NULL;
    }
}

// 两个简单的运算函数
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }

int main() {
    int (*operation)(int, int);
    operation = get_operator('+');  // 获取加法操作的函数指针
    printf("Result: %d\n", operation(5, 3));  // 输出 8
    
    operation = get_operator('-');  // 获取减法操作的函数指针
    printf("Result: %d\n", operation(5, 3));  // 输出 2
    
    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表