回调和函数指针之间的关系是什么?

问题描述 投票:2回答:1

我对这个问题有点困惑。我知道回调是什么,但函数指针对我来说有点混乱。它们可以表示相同的事情(至少在C / C ++上下文中)吗?或者其中一个包括另一个,类似函数指针可以用作回调,反之亦然。

函数指针和回调之间是否存在关系,还是它们完全不同?

c++ c function syntax
1个回答
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");
    }
    ...
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.