C/C++ 函数指针、typedef 定义类型

函数指针是指一个指向函数的指针变量。和普通的指针变量一样,函数指针变量也可以被赋值、传递和使用。

在 C 语言中,函数指针通常用于实现回调函数、动态库加载和函数指针数组等功能。通过函数指针,你可以在运行时动态地选择要执行的函数,从而实现程序的灵活性和可扩展性。


 来一个简单的例子:

void doWork(void *arg, int number); // 函数声明
void doSomeThing(int number);

int main() {
    // 调用 doWork 函数,第一个参数将 doSomeThing 函数强转成函数指针
    doWork((void *) doSomeThing, 88);

    return 0;
}

/**
 * @param arg 函数指针,其实就是一段执行的代码,类似 java 的接口 或 Kotlin 的 lambda
 * @param number
 */
void doWork(void *arg, int number) {
//    void (*function) (int) = (void (*)(int)) arg; // 不使用 auto 推断
    auto function = (void (*)(int)) arg;
    function(number);
}

void doSomeThing(int number) {
    LOGI("传进来的number为:%d", number)
}
  • 在main函数中:

        调用了 doWork 函数,第一个参数是 doSomeThing 函数指针,第二个参数随便传了个88。

  • 在 doWork 函数中:

        接收一个 万能指针 void*,包括函数、变量、结构体指针都能用 void* 来表示(类似 java 中的多态)。因为传进来的是万能指针 void* ,所以要将 void* 强转为函数指针才能使用。

        (void (*)(int)) 分析:

         void:函数的返回值

       (*):函数名,因为是强转,所以通用(*)

       (int):函数的参数

         auto:类型推断,类似 Kotlin 的 var


这个函数指针类型看起来非常的长可读性不太好,可以使用 typedef 对函数指针类型进行封装

typedef void (*doSomeThingPtr)(int);

定义了这个指针函数类型后就可以非常优雅得进行强转了:

void doWork(void *arg, int number) {
    auto function = (doSomeThingPtr) arg;
    function(number);
}

玩起来感觉这个C语言的函数指针和 java 的接口、Kotlin 的 lambda 非常得类似,其本质就是将一段代码进行传递和动态调用。

你可能感兴趣的:(C/C++基础,c语言,c++)