编写函数指针比调用函数指针好在哪里?
How writing function pointers are better than calling them functions?
我最近很高兴使用函数指针。我开始了解它们是如何工作的。函数指针的经典例子是:
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]);
}
基本上,如果您接受一个指向函数的指针作为参数,它允许您对您的[=17]的数据应用客户端提供的操作=]选择.
经典用例(概括)是 qsort (https://linux.die.net/man/3/qsort)。排序算法是通用的,但实现不知道如何比较项目,因为它们可以是任何类型。所以你传入一个函数,它可以调用它来比较两个元素。
"pointer to function" 是一个对象。所以它可以像任何其他对象一样被复制、存储、分配。
其中对函数(普通函数)的引用不是对象。
我认为经典的例子是....通过使用回调函数处理用户界面事件,这已成为任何 UI 软件的明显模式。
如果您像您的示例那样硬编码调用一个或另一个,函数指针几乎是无用的开销。它们的强大之处在于能够动态地挑选和使用它们,或将它们传递给其他函数:
你可以把函数指针放在一个数组中,然后循环它们;或者您可以根据用户输入 或输入文件内容或其他情况调用选定的 。在这两种情况下,他们将允许编写具有单个动态调用的代码,而不是潜在的长开关或 if 语句链。
第二个甚至更有用的概念是将它们传递给其他一些函数(有时也称为 'callbacks');一个典型的例子是用你的数据 table 和函数指针形式的自定义 比较函数 调用 qsort
。然后 qsort 将在标准化排序算法中使用您的比较函数;没有其他方法可以实现这一点。
我最近很高兴使用函数指针。我开始了解它们是如何工作的。函数指针的经典例子是:
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]);
}
基本上,如果您接受一个指向函数的指针作为参数,它允许您对您的[=17]的数据应用客户端提供的操作=]选择.
经典用例(概括)是 qsort (https://linux.die.net/man/3/qsort)。排序算法是通用的,但实现不知道如何比较项目,因为它们可以是任何类型。所以你传入一个函数,它可以调用它来比较两个元素。
"pointer to function" 是一个对象。所以它可以像任何其他对象一样被复制、存储、分配。 其中对函数(普通函数)的引用不是对象。
我认为经典的例子是....通过使用回调函数处理用户界面事件,这已成为任何 UI 软件的明显模式。
如果您像您的示例那样硬编码调用一个或另一个,函数指针几乎是无用的开销。它们的强大之处在于能够动态地挑选和使用它们,或将它们传递给其他函数:
你可以把函数指针放在一个数组中,然后循环它们;或者您可以根据用户输入 或输入文件内容或其他情况调用选定的 。在这两种情况下,他们将允许编写具有单个动态调用的代码,而不是潜在的长开关或 if 语句链。
第二个甚至更有用的概念是将它们传递给其他一些函数(有时也称为 'callbacks');一个典型的例子是用你的数据 table 和函数指针形式的自定义 比较函数 调用 qsort
。然后 qsort 将在标准化排序算法中使用您的比较函数;没有其他方法可以实现这一点。