函數指針和回調函數

函數指針:指向函數的指針 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);
發佈了34 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章