函数指针:指向函数的指针 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);