我想创建一个函数,在一组数据上执行参数传递的函数.在C语言中,如何将函数作为参数传递?

推荐答案

Declaration

接受函数参数的函数的原型如下所示:

void func ( void (*f)(int) );

这说明参数f将是指向具有void返回类型并且接受单个int参数的函数的指针.下面的函数(print)是可以作为参数传递给func的函数的示例,因为它是正确的类型:

void print ( int x ) {
  printf("%d\n", x);
}

Function Call

使用函数参数调用函数时,传递的值必须是指向函数的指针.使用函数的名称(不带括号)执行以下操作:

func(print);

将调用func,并将打印函数传递给它.

Function Body

与任何参数一样,func现在可以在函数体中使用该参数的名称来访问该参数的值.假设func将应用它传递给数字0-4的函数.首先,考虑一下直接调用print的循环会是什么样子:

for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
  print(ctr);
}

由于func的参数声明表示f是指向所需函数的指针的名称,因此我们首先回忆一下,如果f是指针,那么*f就是f指向的对象(即本例中的函数print).因此,只需将上面循环中出现的每一次打印替换为*f:

void func ( void (*f)(int) ) {
  for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
    (*f)(ctr);
  }
}

Source

C++相关问答推荐

当办公室阻止Visual Studio时编码和编译C

Ebpf内核代码:permission denied:invalid access to map value

Tiva TM4C123GXL的I2C通信

如何将字符串argv[]赋给C中的整型数组?

当execvp在C函数中失败时杀死子进程

变量>;-1如何在C中准确求值?

C语言中的strstr问题

为什么我一直收到分段错误?

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

不同出处的指针可以相等吗?

为什么未初始化的 struct 的数组从另一个数组获取值?

按长度对argv中的单词进行排序

C将数组传递给函数以修改数组

使用Open62541向OPCUA服务器发送读请求时内存泄漏

C语言中奇怪的输出打印数组

为什么我的二叉树删除删除整个左部分的树?

在Ubuntu上使用库部署C程序的最佳实践

指向返回 struct 成员的指针,安全吗?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据