C语言中,函数指针是一种指针类型变量,它用于指向函数的地址,从而程序可以通过指针调用函数。这种功能非常强大,在需要动态选择或灵活调用不同函数时尤为实用,如回调函数、函数表或事件处理系统。

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

推荐文档