我们在哪里可以使用C中的函数指针,什么用于函数指针

Ami*_*mar 3 c

就在最近,我在接受采访时被问到:我们在哪里可以使用C中的函数指针?什么函数指针返回.我说使用我们可以使用函数指针调用函数然后他问了一些例子,但我不能满足于他更多的例子.然后他问我什么函数指针返回.我告诉他这取决于函数指针的声明.

但我真的想知道C中函数指针的一些用法.

xan*_*tos 14

我认为C中的经典例子是qsort.从那里引用(我知道它是http://www.cplusplus.com,所以一个不太好的网站,但它似乎是正确的)

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
Run Code Online (Sandbox Code Playgroud)

比较两个元素的函数.该功能应遵循以下原型:

int comparator ( const void * elem1, const void * elem2 ); 
Run Code Online (Sandbox Code Playgroud)

该函数必须接受两个指向元素的参数,类型为void*.应将这些参数转换回某些数据类型并进行比较.

该函数的返回值应表示elem1是否被认为小于,等于或大于elem2,分别返回负值,零或正值.


另一个"经典"的例子是计算器(例如,看到,它是C++,但它在C中是相同的).

例如,您有四个数学函数

float Plus    (float a, float b) { return a+b; }
float Minus   (float a, float b) { return a-b; }
float Multiply(float a, float b) { return a*b; }
float Divide  (float a, float b) { return a/b; }
Run Code Online (Sandbox Code Playgroud)

以某种方式你选择你的操作

/* Here there should be an if or a switch/case that selects the right operation */
float (*ptrFunc)(float, float) = Plus;
Run Code Online (Sandbox Code Playgroud)

你可以稍后调用它(出于某种原因你不想直接调用它if/switch,也许是因为你想要制作对所有操作都"常见"的其他"事物",比如记录或打印结果)

float result = ptrFunc(1.0f, 2.0f);
Run Code Online (Sandbox Code Playgroud)

你可以使用函数指针的另外两件事是回调(由写vine'th)和"穷人"虚函数(你把它们放在一个struct和你创建的时候struct(你知道,就像使用"穷人"构造函数一样,但这是C所以我们将它称为初始化器,你可以保存那里将使用的函数struct).