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

标签 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 函数的一部分,那么我们的程序也会给我们相同的输出。所以对于函数指针,这个程序没有意义。 您能否对此代码进行一些修改,使其成为函数指针的良好示例。

谢谢。

最佳答案

您的代码实际上并不需要将函数作为参数传递。但你的例子相当具有说教意义,可以让你理解函数指针是如何工作的。

但是,了解它们很重要,因为它们可能会变得非常有用,尤其是在处理运行时加载的库时。有大量的例子表明函数指针确实是一个很好的工具。

这是一个:

#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);
}

您打开一个库,搜索cosine函数,然后将其作为参数传递给doOperation

您还可以查看here 了解更多信息。

关于c - c中的所有函数都是全局定义的,那么为什么我们需要将它们作为参数传递给函数呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26410122/

相关文章:

c++ - ((int) 和 (int(a)) 之间有什么区别?

c - Mandelbrot PPM 绘图始终为黑色

c - 带有日期函数的逻辑

c - 在 C 中打印通用变量的名称和值

从 double 转换为 float

python - 如何使用/从命名空间中获取列表元素?

javascript - 一个函数(需要参数)作为另一个函数的参数

Python:函数中的返回列表结果问题

c# - 如何创建指向另一个 Action C# 的 Action?

c - const 关键字是什么意思?