关于函数指针


函数指针

函数指针是指向函数的指针变量,可以将函数作为参数传递给其他函数,也可以在程序中动态选择调用不同的函数。

一般形式

typedef int (*FunctionPtr)(int, int);//定义一个函数指针类型
FunctionPtr ptr;//声明一个函数指针变量
int add(int a, int b)
{
    return a+b;
}
ptr = add; // 直接使用函数名赋值
ptr = &add; //使用地址赋值

使用场景

  1. 将函数作为参数传递给其他函数
void doOperation(int a, int b, FunctionPtr operation){
    int result = operation(a,b);
    printf("Result:%d\n",result);
}
doOperation(2,4,add);
  1. 在运行时动态选择调用不同的函数
  2. 使用函数指针实现回调函数:
typedef void (*Callback)(void);
void registerCallback(Callback cb){
    cb();
}
void myCallback(){
    printf("callback called!\n");
}
registerCallback(myCallback);
  1. 函数指针数组:使用函数指针数组来实现类似分发表的功能,根据索引调用相应的函数。

优点:灵活性,可拓展性,代码复用,缺点: 复杂性,错误风险,可能引发运行时错误。 函数指针在某种程度上可以与策略模式相对应,策略模式是一种行为型设计模式,允许在运行时动态选择算法或行为,可以在运行时动态选择调用不同的函数。 在策略模式中,通常会定义一个抽象策略接口,具体策略类实现该接口,并在使用策略的类中持有策略对象,设置不同的策略对象,在运行时决定要执行的具体行为。 函数指针提供一种类似的机制,通过定义函数指针类型,并在需要的地方传递函数指针作为参数或者设置函数指针成员变量,在运行时动态选择要执行的具体函数。

指针函数和虚函数

有一定的相似之处,也有一些重要的区别:

  1. 功能和用途: 指针函数用于存储和调用函数的地址,允许在运行时动态选择调用不同的函数 虚函数用于实现多态性,允许通过基类指针或引用调用派生类的特定实现。
  2. 继承和多态性: 指针函数不依赖类的继承关系,可以直接使用函数指针来调用相应的函数。 虚函数通过调用动态绑定来实现多态性,需要存在基类和派生类之间的继承关系,并使用基类指针或引用来调用不同的实现。
  3. 静态绑定和动态绑定: 指针函数使用静态绑定,在编译的时候觉得调用的函数。 虚函数使用动态绑定,在运行时候根据对象的实际类型来决定调用的函数。
  4. 拓展性和灵活性: 指针函数可以方便的添加新的函数实现,无需修改调用函数的代码 虚函数提供了更强的封装性和灵活性,在派生类中重写基类的虚函数。

指针数组和数组指针

指针数组,是数组中存放的指针,类似 int a[10]; 主要原因是[]的优先级高于 * ,数组指针 int (ptr)[3]存放的int型的变量。