blj28

导航

函数指针 和 指针函数区别以及使用方法

问题由来:

typedef int(*UaBase_ComFunction)(void);
UABASE_API(int) UaBase_RegisterComFunction(UaBase_ComFunction a_pFunction);
UABASE_API(int) UaBase_UnregisterComFunction(UaBase_ComFunction a_pFunction);

上述代码的作用:声明的一个函数指针(函数类型的指针),作为函数形参传入函数,在使用时可以根据不同功能调用不同的函数
typedef int (*UaBase_ComFunction)(void); 

这行代码是C/C++中的typedef声明,具体解析如下:

  1. typedef: typedef 是用来创建类型别名或者类型同义词的关键字。

  2. int: 这指定了函数指针的返回类型为int。

  3. (*UaBase_ComFunction): 这是正在创建的类型别名,表示一个指向没有参数(void)且返回整数(int)的函数指针。名称UaBase_ComFunction是正在定义的新类型名称。

因此,这行代码定义了UaBase_ComFunction作为一个类型。例如,可以声明类型为UaBase_ComFunction的函数指针,这些指针必须指向符合int function_name(void)签名的函数。

示例用法:

下面是如何使用UaBase_ComFunction的示例:

// 定义一个符合签名的函数
int myFunction(void) {
    return 42;
}

// 声明一个类型为 UaBase_ComFunction 的函数指针
UaBase_ComFunction ptr;

// 将函数指针指向 myFunction
ptr = myFunction;

// 通过指针调用函数
int result = ptr(); // 这会调用 myFunction,并将其返回值(42)存储在 result 中

总结,typedef int (*UaBase_ComFunction)(void); 定义了UaBase_ComFunction作为一个类型,表示指向返回整数并且没有参数的函数的指针。

1、函数指针(function pointer)和指针函数(pointer to function)区别

两个概念上有所不同的术语:

  1. 函数指针(function pointer):

    • 函数指针是指可以指向函数的指针变量。它存储了函数的地址,允许通过该指针调用相应的函数。
    • 在 C/C++ 中,通过函数指针可以实现动态调用不同的函数,使得代码更加灵活和可扩展。

    示例:

    typedef int (*FuncPtr)(void);  // 定义一个函数指针类型
    int myFunction(void) {
        return 42;
    }
    FuncPtr ptr = myFunction;  // 函数指针指向 myFunction
    int result = ptr();  // 调用 myFunction,并获得返回值
  2. 指针函数(pointer to function):

    • 指针函数是指返回类型为指针的函数。它是一个函数,其返回值是一个指针,指向某种数据类型。
    • 通常指针函数用于返回动态分配的内存或者指向函数的指针。

    示例:

    int* createIntPointer(void) {
        int* ptr = (int*)malloc(sizeof(int));
        *ptr = 10;
        return ptr;
    }

因此,函数指针主要用于存储和调用函数,而指针函数则是返回指针的函数。这两者在语法和用途上有明显的区别,理解它们有助于正确使用和理解 C/C++ 中的函数指针和指针函数。

 

 

 

 

2、函数指针(function pointer)的应用

函数指针作为函数参数在 C/C++ 中是一种常见且强大的技术,它允许将函数本身作为参数传递给另一个函数,使得函数调用更加灵活和动态。

示例说明:

假设我们有以下几个函数和一个使用函数指针的函数:

#include <stdio.h>

// 定义一个函数指针类型
typedef int (*UaBase_ComFunction)(void);

// 第一个函数,符合 UaBase_ComFunction 的函数签名
int functionA(void) {
    return 10;
}

// 第二个函数,符合 UaBase_ComFunction 的函数签名
int functionB(void) {
    return 20;
}

// 接受 UaBase_ComFunction 类型参数的函数
void executeFunction(UaBase_ComFunction func) {
    int result = func();  // 调用传入的函数指针
    printf("Result: %d\n", result);
}

int main() {
    // 声明函数指针
    UaBase_ComFunction ptrA;
    UaBase_ComFunction ptrB;

    // 指向不同的函数
    ptrA = functionA;
    ptrB = functionB;

    // 通过 executeFunction 函数调用不同的函数
    executeFunction(ptrA);  // 输出 Result: 10
    executeFunction(ptrB);  // 输出 Result: 20

    return 0;
}

 

解释:

  1. typedef 声明: typedef int (*UaBase_ComFunction)(void); 定义了 UaBase_ComFunction 作为函数指针类型,可以指向返回整数并且没有参数的函数。

  2. 函数 functionA 和 functionB: 这两个函数都符合 UaBase_ComFunction 的函数签名,即返回整数并且没有参数。

  3. executeFunction 函数: 这是一个接受 UaBase_ComFunction 类型参数的函数。在 executeFunction 中,通过传入的函数指针 func 调用不同的函数。

  4. 在 main 函数中的示例: 在 main 函数中,声明了两个函数指针 ptrA 和 ptrB,分别指向 functionA 和 functionB。然后通过 executeFunction 函数调用这两个不同的函数,输出它们的返回结果。

通过这种方式,函数指针使得代码更加灵活,可以根据需要在运行时决定调用哪个函数,从而增加了程序的可扩展性和可维护性。

 

 

 

posted on 2024-07-05 16:57  bailinjun  阅读(114)  评论(0)    收藏  举报