首页 > 其他分享 >函数指针 和 指针函数区别以及使用方法

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

时间:2024-07-05 17:10:47浏览次数:8  
标签:函数 int void ComFunction 函数指针 UaBase 指针

问题由来:

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 函数调用这两个不同的函数,输出它们的返回结果。

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

 

 

 

标签:函数,int,void,ComFunction,函数指针,UaBase,指针
From: https://www.cnblogs.com/blj28/p/18286170

相关文章

  • 超详细Python教程——函数和模块的使用
    函数和模块的使用在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。可以用Python的程序来计算出这个值,代码如下所示。"""......
  • const修饰指针变量和assert断言
    一.const修饰指针变量一般来说,const修饰指针变量,可以放在*的左边,也可以放在*的右边,两个表示方法的意义是不一样的。1.代码1——测试无const修饰的情况voidtest1(){ intn=10; intm=20; int*p=&n; *p=20;//1 p=&m;//2}在这个代码中1和2所在的语句均可以......
  • c++ primer plus 第15章友,异常和其他:15.1.2 友元成员函数
    #c++primerplus第15章友,异常和其他:15.1.2友元成员函数提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:15.1.2友元成员函数提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言15.1.2友元成员函数程序清单15.4tvfm......
  • STM32F1+HAL库+FreeTOTS学习5——内核中断管理及中断控制函数
    STM32F1+HAL库+FreeTOTS学习5——中断管理和临界段代码保护中断简介中断优先级寄存器拓展FreeRTOS中PendSV和Systick中断优先级配置三个中断屏蔽寄存器FreeRTOS中断管理函数代码验证上一期我们学习了FreeRTOS中任务挂起与恢复,在中断服务程序中恢复任务过程中,尤其强调......
  • VBA常用的字符串内置函数
    前言在VBA程序中,常用的内置函数可以按照功能分为字符串函数、数字函数、转换函数等等,本节主要会介绍常用的字符串的内置函数,包括Len()、Left()、Mid()、Right()、Split()、String()、StrConV()等。本节的练习数据表以下表为例:1.使用Len()计算字符串长度示例:Sheet1的A......
  • 测量并打印出被装饰函数的执行时间,优化递归函数
    定义了一个装饰器timer,它测量并打印出被装饰函数的执行时间。这个装饰器使用了Python的time模块来记录函数开始和结束的时间点,然后计算并输出函数的运行时长。使用@timer语法将这个装饰器应用到了fibonacci函数上,这是一个递归实现的斐波那契数列计算函数。当调用fibonacci(10)......
  • 函参中的双重指针
    在学习swap函数时,若想改变实参,可以将函参设置为指针类型。那么函参中的双重指针,也是这种含义。即想改变实参(指针类型)的指向或值时,可以用双重指针。若只是想改变值,可以使用单指针。voidchange(char*p){p="bbb";}intmain(){char*v="aaa";change(v......
  • 【C++学习笔记 8】C++中的析构函数
    构造函数一般用于创建实例或初始化,而析构(destructor)函数则是在销毁一个对象时使用的。析构函数可以用在释放任何内容或需要清理内存空间的场景。举个例子#include<iostream>classEntity{public: floatX,Y; Entity() { X=0.0f; Y=0.0f; std::cout<<......
  • 什么是构造函数?Java 中构造函数的重载如何实现?
    构造函数,就像是建筑房屋时的奠基仪式,是Java类中一个特殊的方法,主要用于初始化新创建的对象。每当创建一个类的新实例时,构造函数就会自动调用,负责为这个新对象分配内存,并对其进行必要的设置,确保对象处于可用状态。它有着与类同名的特殊身份,没有返回类型,甚至连void也不需要声明......
  • 九、函数的声明和定义
    函数声明:1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了。2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。3.函数的声明一般要放在头文件中的。定义的函数在主函数是能运行,但是有一个警告。我们只需要......