我对此主题有些困惑。我知道什么是回调,但是函数指针让我更加困惑。它们是否可以表示同一件事(至少在C / C ++上下文中)?还是其中之一包括其他功能,例如函数指针可以用作回调,反之亦然。
函数指针和回调之间是否存在关系,或者它们是完全不同的主题?
答案 0 :(得分:6)
函数指针通常用于实现回调。一个典型的例子是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");
}
...
}