我有一个带有成员函数指针的结构定义的代码,像这样
struct file_system_type {
struct dentry *(*mount) (struct file_system_type *, int,
const char *, void *);
void (*kill_sb) (struct super_block *);
};
和file_system_type
的对象像这样
static struct file_system_type minix_fs_type = {
.mount = minix_mount,
.kill_sb = kill_block_super,
};
和.mount
像这样
static struct dentry *minix_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
我想知道上面的函数和返回类型是指针的函数有什么区别如果我有这样的东西
static struct dentry* minix_mount(...)
struct dentry *(*mount) (struct file_system_type *, int,
const char *, void *);
void (*kill_sb) (struct super_block *);
是返回类型为struct dentry *
resp的函数指针。void
。首先,你必须给这些指针分配一个实际的函数,通过这些指针调用这些函数。代码中的指针被赋值为
.mount = minix_mount,
.kill_sb = kill_block_super,
static struct dentry *minix_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
是一个返回指针的函数。它已经有一个静态函数体,可以立即调用。
两个调用返回相同类型的值struct dentry *
。
函数指针的一大优点是,您可以编写泛型代码,并在运行时为该指针分配不同的函数。常见的用例是像排序或查找算法这样的算法,在这些算法中可以传递谓词或将函数与函数指针进行比较。
另一个优点是C中的结构体可以包含函数指针,但不能包含函数。这是一种在c中模拟OOP的方法。
下面是一个函数指针指向返回指针的函数的例子:#include <stdio.h>
struct S {
int x;
int y;
// pointers to functions returning a pointer
int *(*compare1)(int *, int *);
int *(*compare2)(int *, int *);
};
// functions returning a pointer
int *min(int *a, int *b) {
return *a < *b ? a : b;
}
int *max(int *a, int *b) {
return *a > *b ? a : b;
}
int main() {
struct S s = {
.x = 5,
.y = 7,
.compare1 = &max,
// .compare2 = &min;
// name of a function can be used as function pointer
.compare2 = min
};
int *result1 = s.compare1(&s.x, &s.y);
int *result2 = s.compare2(&s.x, &s.y);
++*result1;
--*result2;
printf("%d %d", s.x, s.y);
}
输出:
4 8