C 回调函数指针的基本原理

C 回调函数指针的基本原理,c,pointers,callback,function-pointers,C,Pointers,Callback,Function Pointers,为了理解函数指针,我将遵循教程 该示例用于演示函数指针的用途: #include<stdio.h> #include<string.h> int func(char *s) { printf("Callback recieved : %s",s); return 0; } float divide(unsigned int a, unsigned int b, int(*status_callback)(char*)) { status_cal

为了理解函数指针,我将遵循教程 该示例用于演示函数指针的用途:

#include<stdio.h>
#include<string.h>

int func(char *s)
{
    printf("Callback recieved : %s",s);
    return 0;
}

float divide(unsigned int a, unsigned int b, int(*status_callback)(char*))
{
    status_callback("\n Recieved values...validating\n");
    if(b == 0)
    {
        status_callback("\n b = 0 detected, aborting....\n");
        return -1;
    }
    status_callback("\n Validation complete, performing division\n");
    float ret = a/b;
    status_callback("\n Division complete, returning value\n");
    return ret;
}


int main(void)
{
    int(*func_ptr)(char*);
    unsigned int a = 6, b = 3;
    printf("\n This is a prgram to find a/b\n");

    func_ptr = func;

    float ret = divide(a,b,func_ptr);
    printf("\n divide returned [%f]\n",ret);

    return 0;

}
现在我无法理解这里解释的函数指针的基本原理。我下面的代码也可以解决同样的问题(通知应用程序在库级别发生了什么):


使用printf语句可以解决同样的问题。那么为什么要使用函数指针呢

在本例中,调用函数指针与在本地执行
func
的代码相同


但问题是,您可以创建不同的函数,它们的行为不同。一个可以写入文件,另一个可以调用syslog,另一个可以将消息保存到数据库中。然后,它们都可以被传递给divide,而它不会在意。它将消息的写入与计算分离。

函数指针只是从函数调用函数的另一种方法。这种方法主要用于当我们无法确定在complle时间调用的确切函数时。如果在运行时,基于任何先前的计算或重新计算的值,必须更改要调用的函数以获得特定的行为,那么使用函数指针就很方便了


显然,对于简单的情况,它可能看起来不太有用[相反,使用
开关
情况],但对于更复杂的情况,使用这种方法使代码更加健壮和可读。

回调函数指针的另一个重要用途是在所需的处理/信息无法立即获得时接收异步通知。这在操作系统API调用中很常见-您进行调用,传递函数指针,稍后,当操作完成时,一些操作系统线程调用您的函数。

您给出的参考似乎有点误导。它将
函数指针
解释为
回调
,但实际上并不用于回调
对于
函数指针
,这将是一个更好的教程。
qsort()
库函数是
回调

不作为
根运行正常程序的一个很好的例子。坏习惯。
This is a prgram to find a/b
Callback recieved : 
 Recieved values...validating
Callback recieved : 
 Validation complete, performing division
Callback recieved : 
 Division complete, returning value

 divide returned [2.000000]
#include<stdio.h>
#include<string.h>

float divide(unsigned int a, unsigned int b)
{
        printf("\n Recieved values...validating\n");
        if(b == 0)
        {
                printf("\n b = 0 detected, aborting....\n");
                return -1;
        }
        printf("\n Validation complete, performing division\n");
        float ret = a/b;
printf("\n Division complete, returning value\n");
        return ret;
}


int main(void)
{
//      int(*func_ptr)(char*);
        unsigned int a = 6, b = 3;
        printf("\n This is a prgram to find a/b\n");

//      func_ptr = func;

        float ret = divide(a,b);
        printf("\n divide returned [%f]\n",ret);

        return 0;
root@ubuntu:/home/# ./a.out 

 This is a prgram to find a/b

 Recieved values...validating

 Validation complete, performing division

 Division complete, returning value

 divide returned [2.000000]