在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函数的一部分,那么我们的程序也会给我们相同的输出。因此对于函数指针来说,这个程序是没有意义的。
您可以在此代码中进行一些修改,并使其成为函数指针的好例子吗?
谢谢。
最佳答案
您的代码实际上并不需要传递函数作为参数。但是您的示例颇有说服力,可以使您理解函数指针的工作方式。
但是,了解它们很重要,因为它们可能会变得非常有用,尤其是在处理运行时加载的库时。在很多例子中,函数指针确实是一个很好的工具。
这是一个:
#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中查找更多信息。