C语言中把函数名作为函数参数的方法

当在编写函数的时候,存在需要将某一函数作为参数传递到另外一个函数中需求。以下将会讲述实现这一需求的方法。

例如:在函数void function()中,需要将另外一个函数double input()的函数名作为参数。

定义函数input()的函数指针

定义函数指针的方法

函数名和数组名一样,都是代表了函数所在内存块的首地址。所以我们不难得出,通过函数名可以访问函数所在的内存区域中的数据。

所以这就给了函数指针的可行性。我们可以通过一个指针来存储一个函数所在的地址,即通过指针来访问一个函数名所指向的函数。

同时,C语言提供了函数指针变量,定义的方式如下:

// 定义函数指针
返回数据类型 (*函数指针变量名)(形参列表)
// 对比定义函数
返回数据类型 函数名(形参列表)

定义了函数指针变量之后,就可以通过函数名把函数的地址赋值给函数指针了(通过普通的赋值语句即可)。

在复制完毕之后,就可以通过函数指针来调用整个函数了,调用的方法如下:

  1. 函数指针变量(实参列表)
  2. (*函数指针变量名)(实参列表)
// 假设函数为func()
void (*pfunc)(int)
// 第一种方法
pfunc(100);
// 第二种方法
(*pfunc)(100);

此外,需要注意的是,我们可以把一个int类型的变量赋值给int类型的指针,但是不可以将其赋值给double类型的指针。

所以我们不难得出,使用函数指针能够接收的变量,他们定义的函数返回数据类型和形参列表必须一致。此时,就如同变量与指针变量类型一致的时候,才可以把变量的地址赋值给指针变量一样。

// 以下是代码示例
#include<stdio.h>

void func(double a){
    printf("in func, a = %d\n", a);
}

int main(){
    void (*pfunc)(int);
    pfunc = func;
    pfunc(100);
    (*pfunc)(30);

    return 0;
}

// 以下是编译结果
warning: assignment from incompatible pointer type

定义示例中的函数指针

 typedef double (*P)(int);

调用函数

由于之前以及定义了input()函数的函数指针P,所以我们可以把该函数作为函数的参数。

定义一个函数void function(P input),调用function(input)即可。

#include<stdio.h>

typedef void (*P)(int);

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

// 写法1
void fun(int n, void (*show)(int)) {
    int i;
    for(i = 0; i < n; i++){
         show(i);
    }
}

// 写法2
void fun(int n, P show(int)){
    ......
}

int main() {
    fun(10, print);
    return 0;
}

参考文献

  1. 韦凯峰Linux编程学堂-C语言函数指针,敲黑白,讲重点,如何定义函数指针?
  2. Roc_J-【C语言】函数作为函数参数
上一篇
下一篇