就在最近,我在接受采访时被问到:我们在哪里可以使用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).
| 归档时间: |
|
| 查看次数: |
1889 次 |
| 最近记录: |