函数指针和回调函数

函数指针:指向函数的指针 void(*func)()
要和返回指针的函数区分开来 void *func()
下面我们通过一个例子来看下函数值的用法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int add(int a , int b)
{
    return (a+b);
}

int main(int argc, char *argv[])
{
    int a = 100 , b = 10 ;

    int (*padd)(int ,int) = &add;
    /*习惯这样赋值,也可以int (*padd)(int ,int) = add
    * 因为add  和 &add  值是一样的
    */

    printf("%d  %p  %p\n",padd(a,b),add,&add); 

    return 0;
}

在内核中我们经常看到回调函数,这是函数指针的一个经典应用,一些面向对象语言的多态也和这个差不多下面我们来看下代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int add(int a , int b)
{
    printf("call func add\n");
    return (a+b);
}

int mul(int a , int b)
{
    printf("call func mul\n");
    return (a*b);
}

void callFunc(int (*callback)(int ,int),int a,int b)
{
    printf("res = %d\n",callback(a,b));
}


int main(int argc, char *argv[])
{
    int  (*callback)(int ,int);
    int a = 100 , b = 10 ;
    // int (*padd)(int ,int) = &add;
    /*习惯这样赋值,也可以int (*padd)(int ,int) = add
    * 因为add  和 &add  值是一样的
    */
    //printf("%d  %p  %p\n",padd(a,b),add,&add); 
    callback = add;
    callFunc(callback,a,b);

    callback = mul;
    callFunc(callback,a,b);
    return 0;
}

我们在内核中经常看到这种操作,哈哈哈
例如:

int (*ioctl) (struct inode * node, struct file *filp, unsigned int cmd, unsigned long arg);

猜你喜欢

转载自blog.csdn.net/bin_zhang1/article/details/80914674