首页 > 文章列表 > 如何使用 C++ 函数指针传递和调用函数?

如何使用 C++ 函数指针传递和调用函数?

c++ 函数指针
472 2024-04-23

函数指针允许将函数作为参数传递,使函数调用更加灵活。您可以声明函数指针、传递参数,并通过指针运算符调用指向的函数。通过函数指针可以实现动态调度、排序算法选择等高级功能。

如何使用 C++ 函数指针传递和调用函数?

如何使用 C++ 函数指针传递和调用函数

函数指针是一种特殊类型的指针,它指向一个函数。函数指针使我们可以将函数作为参数传递给其他函数,从而实现更高层次的函数调用。

函数指针声明和初始化

要声明函数指针,我们需要指定函数的返回类型和参数类型:

int (*func_ptr)(int, int);

上面代码声明了一个函数指针 func_ptr,它指向一个接收两个整数并返回一个整数的函数。

要初始化函数指针,我们可以使用函数名或函数指针:

func_ptr = my_function;  // 使用函数名
func_ptr = &my_function; // 使用函数指针

其中 my_function 是具有相应签名的函数。

传递函数指针

可以将函数指针作为参数传递给其他函数:

void call_function(int (*func)(int, int)) {
    int result = func(1, 2);
    // ...
}

上面函数 call_function 接收一个函数指针 func,该函数指针指向一个接收两个整数并返回一个整数的函数。

调用函数指针

要调用通过函数指针指向的函数,我们需要使用指针运算符 (*):

int result = (*func_ptr)(1, 2);  // 调用通过 func_ptr 指向的函数

实战案例

考虑以下使用函数指针排序数组的示例:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int compare(int a, int b) {
    return a > b;
}

bool greater_than(int a, int b) {
    return a > b;
}

int main() {
    vector<int> arr = {1, 4, 2, 8, 5};

    // 使用函数指针 compare 降序排序
    sort(arr.begin(), arr.end(), compare);

    // 使用 lambda 表达式升序排序
    sort(arr.begin(), arr.end(), [](int a, int b) {
        return a < b;
    });

    // 使用 std::greater 升序排序
    sort(arr.begin(), arr.end(), greater<int>());

    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在上面的示例中,我们定义了三个比较函数:

  • compare:降序比较函数
  • greater_than:升序比较函数(使用函数指针)
  • [](int a, int b) { return a < b; }:升序比较函数(使用 lambda 表达式)

函数 sort 采用函数指针作为参数,根据指定的比较函数对数组进行排序。该示例演示了如何使用函数指针在不同的排序算法之间轻松切换。