函数指针的用途是什么?例如,如果我有这个:
#include <stdio.h>
void Print1(int(*number)(void)){
printf("%d", number());
}
void Print2(int a)
{
printf("%d", a);
}
int con(void)
{
return 2;
}
int main(void)
{
Print1(&con);
Print2(con());
}
两者都给出了相同的结果,一个是指向其他函数的指针,另一个是调用一个函数,结论?我看不出差异。
答案 0 :(得分:2)
在你的第一个例子中:
Print1(&con);
您正在将函数本身传递给Print1
。在你的第二个例子中:
Print2(con());
当您致电con
时,您正在致电Print2
,并将该值传递给Print2
。如果con
有副作用,这很重要。想象一下在后台执行某些操作的方法(例如磁盘读取)需要很长时间。如果构建它以获取指向完成函数的函数指针,则在完成任务时将调用该函数。如果不这样做,您只需在启动该功能之前调用完成功能。
想象一下,如果你有一个如此定义的函数:
void LongTask(void(*completed)()) {
sleep(5);
completed();
}
必须定义一个函数指针,否则在函数启动之前将调用回调函数。
答案 1 :(得分:2)
查看stdlib.h中的函数qsort
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
它使用快速排序算法对数组大小,大小大小为nmemb的大小进行排序 - 但是你提供了一个比较函数。因此,如果您想要对其中包含奇怪数据类型的数组进行排序,您只需编写比较函数,而不是整个快速排序算法。
显然,windows在其消息循环中也使用回调函数,我认为人们可以找到许多显示其实用性的例子(坦率地说,在某些情况下我觉得它几乎是必需的)
答案 2 :(得分:0)
Print2(con());
只是该函数的返回值,而不是指向函数的指针。
答案 3 :(得分:0)
其他人已经对您的示例代码的细节进行了评论 ,因此我将尝试解决您的问题:函数指针的实用程序是什么?< / em>以一般方式:
函数指针在C *(参见*底部)中特别有用,当你有一组类似于 的函数时包含相同的参数列表,但具有不同的输出 。您可以定义一个函数指针数组,使其更简单,例如,从交换机或循环调用该系列中的函数,或者在池中创建包含一系列线程的函数时类似的工作者作为参数。调用数组使其变得简单,只需更改数组的索引即可获得每个唯一大小写所需的特定功能。
作为一个简单示例 ,两个字符串函数strcat()
和strcpy()
具有参数列表:(char *, const char *)
因此,可以分配给函数指针数组。首先创建函数指针数组:
char * (*pStr[2])( char *a, const char *b);` //array of function pointers pStr[]
然后,将strcat和strcpy的分配给数组:
void someFunc(void)
{
pStr[0] = strcat; //assign strcat to pointer [0]
pStr[1] = strcpy; //assign strcpy to pointer [1]
}
现在,strcat()
或strcpy()
可以被称为:
int main(void)
{
char a[100]="kjdhlfjgls";
char b[100]="kjdhlfjgls";
someFunc();//define function pointers
pStr[0](a, "aaaaaaaa"); //strcat
pStr[1](b, "aaaaaaaa"); //strcpy
return 0;
}
示例输出 :
这只是一个简单的例子。它没有探索函数指针可以提供的全部有用程度,但说明了为什么函数指针在某些情况下可能是首选的另一个原因。
* 此插图仅针对C ,而不是C ++,其中该语言固有的继承和多态的质量会使这个建议没必要。