要了解函数指针,我正在关注this教程 这个例子在那里给出了演示函数指针的目的:
#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;
}
根据作者的说法,函数'divide()'可以被认为是一个库函数。
以上的输出:
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]
使用printf语句解决了相同的目的。那为什么要使用函数指针?
答案 0 :(得分:1)
回调函数指针的另一个重要用途是在所需的处理/信息不可用时立即接收异步通知。这在OS API调用中很常见 - 您进行调用,传递函数指针,稍后,当操作完成时,某些OS线程会调用您的函数。
答案 1 :(得分:0)
在此示例中,调用函数指针与在本地执行func
代码相同。
但关键是你可以创建不同的表现。可以写入文件,另一个可以调用syslog,另一个可以保存在数据库中的消息。然后他们都可以传递给divide
而且不会在乎。它将消息的写入与计算分开。
答案 2 :(得分:0)
函数指针只是从函数调用函数的另一种方法。当我们无法确定 complle time 时要调用的确切函数时,主要使用此方法。如果在运行时,基于任何先前的编译或返回值,必须更改要调用的函数以获取特定行为,使用函数指针很方便。
显然,对于简单的情况,它可能看起来有用[相比之下使用switch
个案例],但对于更复杂的场景,使用这种方法可以使代码更加健壮,可读的。
答案 3 :(得分:0)
您提供的参考资料似乎有点误导。它将function pointers
解释为callbacks
而不实际用于回调。 This是function pointers
的更好教程。 qsort()
库函数是callback
的一个很好的例子。