函数指针在C语言学习的时候提到过,但一直都很少用到。如果分析开源代码,比如说内核,里面就用到了函数指针,用的还很普遍。在内核中对函数指针
有个通俗的名字,叫“钩子函数”。
学习C语言的人喜欢把函数指针和指针函数做区分,我觉得这没多大意思,
两个八竿子打不着的东西放在一起做区分。而且指针函数这个概念也不知道是谁提出来的。返回值为指针的函数就是指针函数?那且不返回int型的函数称为int函数,返回void的函数称为void函数?
函数指针的内核中的使用示例:
- struct module
- {
- ...
- int (*init)(void);
- void (*exit)(void);
- ...
- }
该结构体是对内核中可加载模块的描述,其中就用了两个“钩子函数”,一个init执行模块的入口函数,也就是在编写内核模块的时候 module_init(hello_init);指定的参数。另外一个exit就是模块卸载时的入口函数。例如:
module_exit(hello_exit);
- struct vm_operations_struct {
- void (*open)(struct vm_area_struct * area);
- void (*close)(struct vm_area_struct * area);
- int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf);
- int (*page_mkwrite)(struct vm_area_struct *vma, struct vm_fault *vmf);
- int (*access)(struct vm_area_struct *vma, unsigned long addr,
- void *buf, int len, int write);
- #ifdef CONFIG_NUMA
- int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);
- struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
- unsigned long addr);
- int (*migrate)(struct vm_area_struct *vma, const nodemask_t *from,
- const nodemask_t *to, unsigned long flags);
- #endif
- };
上面是进程虚存区的“操作集”,也就是用结构体封装了一些“钩子函数”。
其实函数指针主要是为了实现面向对象的思想,C++中有类进行封装,C语言就只能靠结构体进行封装,类中有成员函数,但结构体中没有成员函数,没办法,C语言只能使用函数指针来代替成员函数。----------------------------------------------------------------------------------------------
下面使用C语言结构体和函数指针实现一个面向对象的例子。现在可以把一个数组看作一个对象,可以对这个对象定义一些成员函数,比如说get_length(),get_max(),get_min()等。
- #include <stdio.h>
- #define array_size(x) (sizeof(x)/sizeof((x)[0]))
- struct array{
- int array_len;
- int max;
- int min;
- int (*get_max)(int *);
- int (*get_min)(int *);
- void (*print)(struct array *);
- };
- struct array arr;
- int get_max(int a[])
- {
- int max = a[0];
- int i;
- for (i = 1;i < arr.array_len;i++) {
- if (a[i] > max)
- max = a[i];
- }
- return max;
- }
- int get_min(int a[])
- {
- int min = a[0];
- int i;
- for (i = 1;i < arr.array_len;i++) {
- if (a[i] < min)
- min = a[i];
- }
- return min;
- }
- void print(struct array *arr)
- {
- printf("array_len = %d\n",arr->array_len);
- printf("array_max = %d\n",arr->max);
- printf("array_min = %d\n",arr->min);
- return ;
- }
- void init(void)
- {
- arr.get_max = get_max;
- arr.get_min = get_min;
- arr.print = print;
- }
- int main(void)
- {
- int a[] = {1,2,3,4,5,6,7,8,9};
- init();
- arr.array_len = array_size(a);
- arr.max = arr.get_max(a);
- arr.min = arr.get_min(a);
- arr.print(&arr);
- return 0;
- }
---------------------------------------------------------------------------------------------
函数指针只是定义了一个接口。也就是一个钩子,钩子上挂的东西不清楚。
具有很强的拓展性。
阅读(1468) | 评论(0) | 转发(0) |