c中的所有函数都是全局定义的,那么为什么我们需要将它们作为参数传递呢?

时间:2014-10-16 17:10:46

标签: c function pointers function-pointers

在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函数的一部分,那么我们的程序也会给我们相同的输出。对于函数指针,这个程序没有意义。 你可以在这段代码中做一些修改,并为函数指针做好准备。

感谢。

4 个答案:

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