在c中,我们必须全局定义所有函数。在学习函数指针时,我得到了一些程序员将函数名作为参数传递给其他函数的程序。那么为什么我们需要将函数传递给其他函数,如果它们都是全局定义的呢?
这里我给的是小样本程序:
#include<stdio.h>
void bsort(int arr[],int n,int (*compare)(int,int)) //bubble sort
{
int i,j,temp;
for(i=0;i<n;i++){
for(j=0;j<n-i-1;j++){
if(compare(arr[j],arr[j+1]) > 0 ){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int compare(int a,int b)
{
if(a > b) return 1;
return -1;
}
void main()
{
int i;
int arr[5]={6,5,1,9,2};
bsort(arr,5,compare);
for(i=0;i<5;i++)
printf("%d ",arr[i]);
}
在这段代码中,如果我们在定义中删除第三个参数并调用bsort函数的一部分,那么我们的程序也会给我们相同的输出。对于函数指针,这个程序没有意义。 你可以在这段代码中做一些修改,并为函数指针做好准备。
感谢。
答案 0 :(得分:1)
您的代码实际上不需要将函数作为参数传递。但是你的例子很有说服力,可以让你理解函数指针是如何工作的。
但理解它们非常重要,因为它们可能会变得非常有用,尤其是在处理运行时加载的库时。有很多例子,函数指针确实是一个很好的工具。
这是一个:
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
double doOperation(double arg, double (*func)(double))
{
return (*func)(arg);
}
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
printf ("%f\n", doOperation(2.0, cosine);
dlclose(handle);
}
您打开一个库,搜索余弦函数,然后将其作为参数传递给 doOperation 。
您还可以查看 here 了解更多信息。
答案 1 :(得分:0)
当您可能需要根据某些动态要求更改函数调用的行为时,将使用函数指针。
This页面总结简短而且甜蜜:
函数指针是一个变量,用于存储稍后可以通过该函数指针调用的函数的地址。这很有用,因为函数封装了行为。例如,每次你需要一个特定的行为,比如绘制一条线,而不是写出一堆代码,你需要做的只是调用函数。但有时你想在不同的时间在基本相同的代码中选择不同的行为。
有一些很好的例子可供选择。
答案 2 :(得分:0)
您将函数[指针]传递给另一个函数,因为您想要动态地指示接收者调用的函数。或者更确切地说,因为接收器功能是为了允许您这样做而构建的,因此需要您这样做。在编译接收器时,指向函数不需要可用。
作为qsort()
参数所需的比较函数是原型示例。
答案 3 :(得分:0)
问:为什么要将一个函数传递给另一个函数?
如果不重写bsort()
,代码只需更改比较函数就可以排序多种方式。
#include <stdio.h>
#include <stdarg.h>
int compare_up(int a,int b) {
if(a > b) return 1;
return -1;
}
int compare_down(int a,int b) {
if(a < b) return 1; // reverse the compare
return -1;
}
int compare_random(int a,int b) {
return rand() & 1; // mix them up
}
int main(void) {
int i;
int arr[5]={6,5,1,9,2};
bsort(arr,5,compare_up);
for(i=0;i<5;i++) printf("%d ",arr[i]); puts("");
bsort(arr,5,compare_down);
for(i=0;i<5;i++) printf("%d ",arr[i]); puts("");
bsort(arr,5,compare_random);
for(i=0;i<5;i++) printf("%d ",arr[i]); puts("");
return 0;
}