当前位置: 首页 > news >正文

指针(四)- 函数指针和回调函数

 函数指针

函数的二进制代码存放在内存四区中的代码段,函数的地址是它在内存中的起始地址。如果把函数的地址作为参数传递给函数,就可以在函数中灵活的调用其它函数。 

        使用函数指针的三个步骤:

        a)声明函数指针;

        b)让函数指针指向函数的地址;

        c)通过函数指针调用函数。

1)声明函数指针

声明普通指针时,必须提供指针的类型。同样,声明函数指针时,也必须提供函数类型,函数的类型是指返回值参数列表(函数名和形参名不是)

假设函数的原型是:

int func1(int bh,string str);

则函数指针的声明是:

int  (*pfa)(int,string);

pfa是函数指针名,必须用括号,否则就成了返回指针的函数。

2)函数指针的赋值

函数名就是函数的地址。

函数指针的赋值:函数指针名=函数名;

3)函数指针的调用

(*函数指针名)(实参);

函数指针名(实参);

#include<iostream>
using namespace std;

void func(string str)
{
    cout<<"函数指针示例"<<endl;
}

int main(){
    string message = "调用函数指针的信息";

    func(message);    //普通调用

    void (*func)(string);    //声明函数指针
    pfunc = func;            //对函数指针赋值,语法是函数指针名 = 函数名。
    pfunc(message);          //用函数指针名调用函数。C++
    (*pfunc)(message);       //用函数指针名调用函数。C语言。
}

回调函数是把一个函数的代码嵌入到另外一个函数中,调用函数提供了·主体的流程和框架,具体功能由回调函数来完成。在写调用函数时,只要确定回调函数的种类,不关心回调函数的功能。

如何让给回调函数传参:

        由调用函数提供实参

        把实参从外面传进去

#include<iostream>
using namespace std;
void print(string str)        //回调函数
{
    cout << "str = " << str << endl;
}

void show(void (*pf)(string), int b)
{
    string str = "hhhhh";    //通过回调函数传参
    pf(str);
}

int main() {
    //show(print);
    show(print, 5);

    return 0;
}

相关文章:

  • 【职场必备知识】成都购房政策调研
  • 什么是xhr?XMLHttpRequest的基本使用及xhr Level2的新特性详解及案例
  • VMware-安装 CentOs-Linux 操作系统
  • 【老生谈算法】matlab实现LMS算法的自适应滤波算法源码——自适应滤波
  • Springboot 玩一玩代码混淆,防止反编译代码泄露
  • 【配电网重构】基于matlab负荷平衡的配电网重构【含Matlab源码 2180期】
  • 计算机网络---第二章物理层---通信基础
  • 【JAVA问题解决方案】01.EasyExcel导出数据超过Excel单表上限解决方案
  • 第一个C/C++项目
  • 让人获益匪浅的学习网站
  • C语言——经典200道实例(51-55)
  • 软件测试是干什么的?为什么受就业者的欢迎?
  • SpringMVC执行流程
  • 图片的谱表征
  • 基于Vue+node的图书馆座位预约选座管理系统
  • CEF与代理
  • java概述
  • js算法-归并排序(merge_sort)
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • overflow: hidden IE7无效
  • QQ浏览器x5内核的兼容性问题
  • vue-router的history模式发布配置
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 老板让我十分钟上手nx-admin
  • 让你的分享飞起来——极光推出社会化分享组件
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 因为阿里,他们成了“杭漂”
  • mysql面试题分组并合并列
  • zabbix3.2监控linux磁盘IO
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # Redis 入门到精通(七)-- redis 删除策略
  • #前后端分离# 头条发布系统
  • (02)Hive SQL编译成MapReduce任务的过程
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (CPU/GPU)粒子继承贴图颜色发射
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)React组件、useState、组件样式
  • .net 4.0发布后不能正常显示图片问题
  • .Net Core 生成管理员权限的应用程序
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net Redis的秒杀Dome和异步执行
  • .net 按比例显示图片的缩略图
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • :如何用SQL脚本保存存储过程返回的结果集
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解