📜  函数指针 (1)

📅  最后修改于: 2023-12-03 14:50:10.684000             🧑  作者: Mango

函数指针

函数指针是指向函数的指针变量。在C和C++中,函数名本质上就是指向函数的指针,可以通过函数名来调用函数,也可以通过函数指针来调用函数。在许多情况下,函数指针可以使用函数指针类型的形式参数来传递,使得程序具有更好的可扩展性和灵活性。

函数指针的声明

函数指针的声明需要注意以下几点:

  • 函数指针的声明需要指明函数的返回类型和参数类型。
  • 函数指针的名称可以根据个人喜好进行命名,但通常为了清晰,都应该将指向的函数名包含在名称中。
  • 函数指针的声明使用的符号是*,这是因为函数指针本质上是一个指向函数的指针变量。

以下是一个函数指针的声明:

int (*pfunc)(int, double);

该声明表示pfunc是一个指向函数的指针变量,该函数返回类型为int,接受两个参数一个是int类型,一个是double类型。

函数指针的赋值和调用

函数指针可以被赋值为指向某个函数的地址,使用指针来调用函数和直接调用函数的效果是一样的。

以下是函数指针的赋值和调用示例:

#include <stdio.h>

int foo(int a, double b) {
    return a + (int)b;
}

int main() {
    int (*pfunc)(int, double) = &foo; // 将pfunc指向foo函数
    int result = (*pfunc)(5, 3.14); // 调用foo函数
    printf("result=%d\n", result);
    return 0;
}

在上面的示例中,首先用&pfunc将pfunc赋值为了指向foo函数的地址,然后通过(*pfunc)()来调用foo函数,将函数返回值赋值给result。最终在控制台输出了result的值。

函数指针作为形参

函数指针可以作为函数的形参被传递,这种技巧可以避免针对不同类型函数而写出多个相似的函数代码。一般而言,将函数指针作为形参来实现回调函数。

以下是函数指针作为形参的示例:

#include <stdio.h>

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

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

int calculate(int (*pfunc)(int, int), int a, int b) {
    return (*pfunc)(a, b);
}

int main() {
    int a = 5, b = 3, result;
    result = calculate(&add, a, b);
    printf("add(%d, %d)=%d\n", a, b, result);
    result = calculate(&subtract, a, b);
    printf("subtract(%d, %d)=%d\n", a, b, result);
    return 0;
}

在上面的示例中,calculate函数中的第一个形参pfunc是指向函数的指针变量,可以通过该函数指针变量调用指定函数。在main函数中,分别调用了calculate函数,将add和subtract函数的地址作为第一个形参传递给calculate函数。

总结

函数指针是C和C++中一个非常重要和强大的概念,使得程序具有更好的可扩展性和灵活性。熟练使用函数指针可以帮助程序员编写出更简洁高效的代码,从而提升开发效率。