C 语言 - 函数指针

函数指针是指向函数的指针变量

通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数

函数指针可以像一般函数一样,用于调用函数、传递参数

声明一个函数指针

函数指针变量的声明语法如下

typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

范例

下面的代码声明了一个函数置身变量 p, 并将它指向函数 max()

/**
 * file: main.c
 * author: 简单教程(www.twle.cn)
 */

#include <stdio.h>

int max(int x, int y)
{
    return x > y ? x : y;
}

int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;

    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);

    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); 

    printf("最大的数字是: %d\n", d);

    return 0;
}

编译运行以上 C 语言代码,输出结果如下

$ gcc main.c && a.out
请输入三个数字:8 10 12
最大的数字是: 12

typedef 定义指针类型

C 语言可以使用 typedef 将函数指针定义为一个类型

例如我们可以定义一个接受两个 int 型的参数,然后返回一个 int 型的的函数类型

typedef int (*func)(int, int);

看起来是不是和定义一个 函数指针 类似,这样,我们就可以用这个函数类型声明一个函数指针变量了

func p = max;

我们用一段代码来演示下

/**
 * file: main.c
 * author: 简单教程(www.twle.cn)
 */

#include <stdio.h>

typedef int (*func)(int x, int y);

int max(int x, int y)
{
    return x > y ? x : y;
}

int main(void)
{
    /* p 是函数类型 func 的变量 */
    func p = max;
    int a, b, c, d;

    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);

    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); 

    printf("最大的数字是: %d\n", d);

    return 0;
}

编译运行以上 C 语言代码,输出结果如下

$ gcc main.c && a.out
请输入三个数字:8 10 12
最大的数字是: 12

函数参数

既然可以定义函数指针类型,那么就可以将函数指针作为参数传递给另一个函数了

例如下面的代码

/**
 * file: main.c
 * author: 简单教程(www.twle.cn)
 */

#include <stdio.h>


typedef int (*func)(int, int);

int max(int x, int y)
{
    return x > y ? x : y;
}

int handle_it (int x, int y, func p)
{
    int z = p(x,y);
    return z;
}


int main(void)
{
    int a, b, c;

    printf("请输入两个数字:");
    scanf("%d %d", & a, & b);

    c = handle_it(a, b, max);


    printf("最大的数字是: %d\n", c);

    return 0;
}

编译运行以上 C 语言代码,输出结果如下

$ gcc main.c && a.out
请输入三个数字:10 12
最大的数字是: 12

回调函数

经过前面章节的学习,我们知道,任何函数都有返回值,哪怕没有显式的 return 语句

如果一个函数接受函数指针作为参数,最后返回的结果是调用指针的结果,那么我们就称这个函数指针为回调函数

其实上面的范例中 max() 函数就是函数 handle_it() 的回调函数了,不过我们可以写的更清楚明白些

/**
 * file: main.c
 * author: 简单教程(www.twle.cn)
 */

#include <stdio.h>


typedef int (*func)(int, int);

int max(int x, int y)
{
    return x > y ? x : y;
}

int handle_it (int x, int y, func p)
{
    return p(x,y);
}


int main(void)
{
    int a, b, c;

    printf("请输入两个数字:");
    scanf("%d %d", & a, & b);

    c = handle_it(a, b, max);


    printf("最大的数字是: %d\n", c);

    return 0;
}

编译运行以上 C 语言代码,输出结果如下

$ gcc main.c && a.out
请输入三个数字:10 12
最大的数字是: 12
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.