函數指針:指向函數的指針 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);