指向函数实用程序的指针

时间:2014-02-06 16:00:33

标签: c pointers function-pointers

函数指针的用途是什么?例如,如果我有这个:

#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());
}

两者都给出了相同的结果,一个是指向其他函数的指针,另一个是调用一个函数,结论?我看不出差异。

4 个答案:

答案 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;
}  

示例输出
enter image description here

这只是一个简单的例子。它没有探索函数指针可以提供的全部有用程度,但说明了为什么函数指针在某些情况下可能是首选的另一个原因。

* 此插图仅针对C ,而不是C ++,其中该语言固有的继承和多态的质量会使这个建议没必要。