如何编写函数指针比调用它们更好

How writing function pointers are better than calling them functions?

本文关键字:更好 调用 何编写 函数 指针      更新时间:2023-10-16

我最近很喜欢使用函数指针。我得知道他们是怎么工作的。函数指针的经典例子是:

int add() {
  return (100+10);
}
int sub() {
  return (100-10);
}
void print(int x, int y, int (*func)()) {
  printf("value is : %d", (x+y+(*func)()));
}
int main() {
  int x=100, y=200;
  print(x,y,add);
  print(x,y,sub);
}

前几天有人问我,如何比调用(inside main)更好:

print(add(x,y));
print(sub(x,y));

,我努力解释。只是因为这堆东西,还是因为下面还有别的东西?

我真的不明白为什么您展示的代码是函数指针的经典示例。函数指针的效用在如下代码中更加明显:

void transform(int *dst, const int *src, size_t len, int (*f)(int))
{
  for (size_t i = 0; i < len; ++i)
    dst[i] = f(src[i]);
}

基本上,如果你接受一个指向函数的指针作为参数,它允许你在选择的数据上应用客户机提供的操作。

经典用例(泛化)是qsort (https://linux.die.net/man/3/qsort)。排序算法是通用的,但实现不知道如何比较项,因为它们可以是任何类型。所以你传入一个函数,它可以调用它来比较两个元素。

函数指针是非常无用的开销,如果您硬编码调用其中一个,就像您的示例一样。它们的强大之处在于能够动态地选择和使用它们,或者将它们传递给其他函数:

你可以把函数指针放在数组中,然后遍历它们;也可以根据用户输入、输入文件内容或其他情况调用选定的。在这两种情况下,它们都允许编写具有单个动态调用的代码,而不是潜在的长switch或if语句链。

第二个更有用的概念是将它们传递给其他函数(有时也称为"回调");一个经典的例子是用你的数据表和一个自定义的比较函数以函数指针的形式调用qsort。然后Qsort将在标准化排序算法中使用你的比较函数;没有其他方法可以实现这个

"指向函数的指针"是一个对象。所以它可以像其他对象一样被复制,存储,赋值。其中对函数(普通函数)的引用不是对象。

我认为最经典的例子是....用户界面使用回调函数处理事件,这已经成为任何UI软件的明显模式。