1、函数指针
函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
函数指针的定义与声明:
int (*fun)(int, int);
上面的式子定义了一个函数指针fun,可以赋值给一个有两个int型参数,返回值为int型的函数。
举个例子:
int add (int a, int b) {
return a + b;
}
int sub (int a, int b) {
return a - b;
}
int main()
{
int (*fun)(int, int);
fun = add;
int result = fun(2, 1);
cout << result << endl;
fun = sub;
result = fun(2, 1);
cout << result << endl;
return 0;
}
//执行结果
3
1
在上面例子中,定义了函数指针fun,fun可以指向不同的函数,当指向add函数时,执行fun(2, 1)所运行的函数就是add函数。指向sub函数时同理。
2、函数指针与typedef
直接通过代码更加清晰:
int add (int a, int b) {
return a + b;
}
int sub (int a, int b) {
return a - b;
}
int main()
{
typedef int (*fun)(int, int);
fun test1 = add;
int result = test1(2, 1);
cout << result << endl;
fun test2 = sub;
result = test2(2, 1);
cout << result << endl;
return 0;
}
//执行结果
3
1
typedef用法是给一个存在的类型取一个别名,上面的例子中fun被定义为了一个函数的类型,被fun修饰得test即为一个函数,并且test函数是有两个int类型的参数,返回一个int类型。
3、函数指针与struct
举个例子:
struct func {
int (*add)(int a, int b);
int (*sub)(int a, int b);
};
int test_add(int a, int b)
{
return a + b;
}
int test_sub(int a, int b)
{
return a - b;
}
struct func func2= {
.add = test_add,
.sub = test_sub,
};
int main()
{
int a = 2 ,b = 1;
cout << func2.add(a, b) << endl;
cout << func2.sub(a, b) << endl;
return 0;
}
//执行结果
3
1
函数指针与struct的使用在工程中运用十分广泛,如在linux驱动中,平台端已经搭建好了框架,我们更多的是将暴露出来的接口进行填充即可,例如在平台设备驱动中platform_driver结构体:文章来源:https://www.toymoban.com/news/detail-594954.html
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
bool prevent_deferred_probe;
};
均是通过函数的指针的方式将接口进行传递,我们只要填充相应的probe、remove等需要的函数即可。文章来源地址https://www.toymoban.com/news/detail-594954.html
到了这里,关于函数指针定义与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!