函数指针定义与使用

这篇具有很好参考价值的文章主要介绍了函数指针定义与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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结构体:

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux shell编程学习笔记24:函数定义和使用

    *20231113 补充了实例使用for循环来简化代码的内容 为了实现模块化设计和代码重用,很多编程语言支持函数或过程,Linux shell也支持函数定义和调用。 Linux shell中的函数与其它编程语言很多有相似之处,也有自己独特之处。 其中: function是 Shell 中的,专门用来定义函数

    2024年02月05日
    浏览(60)
  • 【C++】多态 ⑧ ( 验证指向 虚函数表 的 vptr 指针 | 对比定义了虚函数的类和没有定义虚函数类的大小 )

    对比 定义了 虚函数 的类 与 没有定义虚函数的类 的大小 , 其它成员都相同 , 定义了虚函数的类多出了 4 字节 , 多出的 4 字节就是 vptr 指针占用的内存空间 ; \\\" 虚函数表 \\\" 由 C++ 编译器 负责 创建 与 维护 , 被 virtual 修饰的 虚函数 , 会自动 被 C++ 编译器 存储到 \\\" 虚函数

    2024年02月06日
    浏览(38)
  • c语言函数指针和指针函数的区别,以及回调函数的使用。

    函数指针 是什么,函数指针本质也是指针,不过是指向函数的指针,存储的是函数的地址。 指针函数 是什么,指针函数其实就是返回值是指针的函数,本质是函数。 函数指针是如何定义的呢,如下 这里 * pfun 需要 加括号 ,否则定义为了指针函数。 指针函数的定义如下: 下面

    2024年02月11日
    浏览(45)
  • linux驱动开发:Linux 内核的一些函数

    1 、 MKDEV ( ma, mi ) 构造设备号,将主设备号和次设备号转换为设备号类型(dev_t)。 MKDEV 宏将主设备号( ma )左移 20 位,然后与次设备号( mi )相与,得到设备号。 dev_t 结构 主设备号 12 位

    2024年02月17日
    浏览(37)
  • C语言:函数指针的使用

    在C语言中,函数指针是指向函数的指针变量。它可以存储函数的地址,使得可以通过该指针来调用函数。以下是函数指针的基本概念和用法: 一、基本概念: 声明函数指针: 这里 returnType 是函数返回类型, parameterTypes 是函数参数类型。例如: 初始化函数指针: 或者更简洁

    2024年01月21日
    浏览(35)
  • linux驱动开发(四):ioctl()函数

    前文中我们介绍了应用程序通过使用虚拟文件系统VFS提供的接口,来控制字符驱动程序,完成字符驱动设备的open、close、read、write操作。但是如果我们想进行除此以外的其他操作,拓展一些file_operations给出的接口中没有的自定义功能,则需要使用到ioctl()函数。 首先,我们需

    2024年01月16日
    浏览(40)
  • move与函数指针的简单使用

    C++11的标准库 提供了一个非常有用的函数 std::move(),std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。 就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝 str 就没有了因为被转移语义了 执行结果 这里函数指针还能用,因为

    2024年02月11日
    浏览(29)
  • linux tty 驱动之ioctls 函数

    在 struct tty_driver 中的 ioctl 函数被 tty 核心调用当 ioctl(2) 被在设备节点上 调用. 如果这个 tty 驱动不知道如何处理传递给它的 ioctl 值, 它应当返回 - ENOIOCTLCMD 来试图让 tty 核心实现一个通用的调用版本. 2.6 内核定义了大约 70 个不同的 tty ioctls, 可被用来发送给一个 tty 驱动. 大部

    2024年01月19日
    浏览(31)
  • 结构体的使用和结构体指针的定义注意事项

    1、使用背景      由于想把不同地方的三个变量数据存放在一个结构体中,并且调用W25QXX_Write((u8*)p,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,写入SIZE长度的数据。调用flash写数据函数,其参数为指针地址,于是需要定义一个结构体和指向结构体的指针,这样调用flash写函数

    2024年01月20日
    浏览(52)
  • Quartz自定义的Job使用@Autowire提示空指针问题

    一. 问题描述 在我们的自定义的Job类中,想用@Autowire注入属性,但该属性为空 public class MyJob implements Job {     @Autowired     private RabbitTemplate rabbitTemplate;     @Override     public void execute(JobExecutionContext context) throws JobExecutionException {         // Job中需要执行的方法         Sy

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包