我对这个问题有点困惑。我知道回调是什么,但函数指针对我来说有点混乱。它们可以表示相同的事情(至少在C / C ++上下文中)吗?或者其中一个包括另一个,类似函数指针可以用作回调,反之亦然。
函数指针和回调之间是否存在关系,还是它们完全不同?
函数指针通常用于实现回调。一个典型的例子是qsort
函数:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
该函数的第四个参数是函数指针。这通常会指向您自己编写的qsort
函数将调用的函数。以下是如何使用它的示例:
int cmp(const void *v1, const void *v2)
{
const int *i1 = v1; // C++ requires cast, C doesn't
const int *i2 = v2; // C++ requires cast, C doesn't
if (*i1 < *i2) {
return -1;
} else if (*i1 > *i2) {
return 1;
} else {
return 0;
}
}
int main()
{
int array[] = { 3, 7, 5, 1, 2, 9, 0, 4 };
qsort(array, 8, sizeof(int), cmp);
}
在这个例子中,cmp
用于告诉qsort
函数如何排序列表的元素。
另一个不是回调的函数指针示例是,如果要根据某个标志调用特定类型的函数。例如:
void foo(int case_sensitive)
{
int (*cmpfunc)(const char *, const char *);
if (case_sensitive) {
cmpfunc = strcmp;
} else {
cmpfunc = strcasecmp;
}
...
// set strings str1 and str2
...
if (cmpfunc(str1, str2) == 0)) {
printf("strings are equal\n");
} else {
printf("strings are not equal\n");
}
...
// set strings str3 and str4
...
if (cmpfunc(str3, str4) == 0)) {
printf("strings are equal\n");
} else {
printf("strings are not equal\n");
}
...
}