函数指针与回调函数

news/2024/11/20 8:40:59/

(1) 

1分钟学会函数指针与回调函数(上)_哔哩哔哩_bilibili

#include <QCoreApplication>
#include <stdio.h>int sum(int x,int y){
return x+y;
}
int difference(int x,int y){
return x-y;
}
int product(int x,int y){
return x*y;
}int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);int a=5;int b=8;int (*p_func)(int,int);p_func=sum;printf("sum's address=%p\n",sum);printf("func_ptr=%p\n",p_func);printf("%d+%d=%d\n",a,b,sum(a,b));printf("%d+%d=%d\n",a,b,p_func(a,b));return app.exec();
}
sum's address=00401659
func_ptr=00401659
5+8=13
5+8=13

函数指针func_ptr指向的地址为00401659

函数名的首地址是00401659

函数名可以被看作一个常量,它保存了函数的内存地址

函数的内存地址,存储了函数开始执行的位置

(2) 

C语言 | 函数指针作为函数的参数_函数指针作为参数_嵌入式大杂烩的博客-CSDN博客

#include <QCoreApplication>
#include <stdio.h>typedef int (*fun_t)(int,int);
int calculate(int a,int b,fun_t operation)
{int result;result=operation(a,b);return result;
}
int add2(int a,int b)
{return a+b;
}int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);int result;int a=192,b=48;result=calculate(a,b,add2);printf("%d+%d=%d\n",a,b,result);return app.exec();
}

关键:

typedef int (*fun_t)(int, int);

fun_t指向一个带两个int类型的形参int类型的返回值的函数。

使用关键字typedef int(*)(int,int)进行重命名为fun_t。

函数指针可以作为参数传递给另一个函数。

这时函数指针的使用就像普通的常量和变量

函数指针作为参数传递的时候,接收参数传递的函数

通常需要根据指针调用对应的函数

(3)

函数指针做函数参数 使用总结及其意义_函数指针作为函数的参数_AI浩的博客-CSDN博客

函数名是函数体的入口地址

(1)可通过函数类型定义函数指针:FuncType* pointer;

(2)可直接定义:type (*pointer)(parameter list);

pointer:函数指针变量名

type:函数的返回值类型

parameter list:指向函数的参数列表。

#include <QCoreApplication>
#include <iostream>
using namespace std;
int add(int a,int b)
{return a+b;
}int main(int argc, char *argv[])
{QCoreApplication app(argc, argv);int sum=add(1,2);cout<<"sum:"<<sum<<endl;//声明一个函数类型{typedef int(MyFuncType)(int a,int b);MyFuncType * myFuncVar=NULL;myFuncVar=add;int sum1=myFuncVar(2,4);cout<<"sum1:"<<sum1<<endl;}//声明一个函数指针类型。{typedef int(*PFuncType)(int a,int b);PFuncType myFunc=NULL;myFunc=&add;int sum2=myFunc(3,5);cout<<"sum2:"<<sum2<<endl;}//定义一个函数指针,指向一个函数的入口地址{int(*MYPFUNC)(int a,int b);MYPFUNC =add;int sum3=MYPFUNC(10,5);cout<<"sum3:"<<sum3<<endl;}return app.exec();
}

sum:3
sum1:6
sum2:8
sum3:15

 思考:

myFunc=&add;

这里为什么要取地址?

    {typedef int(*PFuncType)(int a,int b);PFuncType myFunc=NULL;myFunc=&add;int sum2=myFunc(3,5);cout<<"sum2:"<<sum2<<endl;}{typedef int(*PFuncType)(int a,int b);PFuncType myFunc=NULL;myFunc=add;int sum2=myFunc(3,5);cout<<"sum2:"<<sum2<<endl;}

结果一致,这两者有什么区别?

函数指针做函数参数:

函数指针A指向函数C

函数指针A作为函数参数,传递给一个被调用函数B,被调用函数

就可通过该指针调用外部函数C,这就形成了回调。


http://www.ppmy.cn/news/1127491.html

相关文章

set和map的学习

文章目录 0.底层实现1.set的原型2.set的成员函数1.构造函数2.代码演示 3.map的原型4.map的成员函数1.构造函数2.代码演示 5.OJ练习1.前K个高频单词法一:mapvectorstable_sort法二:mapvectorsort[控制逻辑]法三:mapmultimapvector[leetcode巧合]法四:mapmultisetvector法五:优先…

Selenium Webdriver自动化测试框架

最近正在编写selenium webdriver自动化框架&#xff0c;经过几天的努力&#xff0c;目前基本已经实现了一套即能满足数据驱动、又能满足Web关键字驱动的自动化框架&#xff08;主要基于 antjenkinstestngselenium webdriverjxl实现&#xff09;。通过这次的自动化框架开发&…

Springboot使用Mybatis框架连接MySQL数据库

1、依赖注入 注入MySQL依赖&#xff08;MySQL驱动使用Springboot版本对应的推荐版本&#xff0c;不需要手动指定版本&#xff09; <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime<…

我只说一遍!这几个程序员都在用的接单平台还不赶快收藏好!!!

作为一个程序员&#xff0c;想不想在闲暇之余在网上接点兼职&#xff0c;靠自己的本领赚一点外快&#xff1f;毕竟做人嘛&#xff0c;不要和钱过不去&#xff0c;可是放眼如今的接单平台&#xff0c;五花八门&#xff0c;参差不齐&#xff0c;是不是又不知道该从何下手&#xf…

通信协议:Uart的Verilog实现(下)

4、UART接收器 UART接收器负责接收串行比特流&#xff0c;去除起始位和停止位&#xff0c;并以并行格式将数据保存到与主机数据总线相连的寄存器里。接收器无法获得发送时钟&#xff0c;因此尽管数据以标准比特率到达&#xff0c;但数据未必与接收主机内的时钟同步。同步问题可…

VB6.0开发文件管理小数据库-基于ACCESS

今天的客户也是小客户&#xff0c;需要对文件的一些操作记录在数据库里面&#xff0c;这里采用的数据库ACCCESS&#xff0c;用的是VB自带的可视化数据管理器创建的mdb数据库文件。实现了数据的增删改查。简单方便。基本可以用这套代码模板实现大部分的数据库功能了。想研发或学…

【Verilog 教程】6.2Verilog任务

关键词&#xff1a;任务 任务与函数的区别 和函数一样&#xff0c;任务&#xff08;task&#xff09;可以用来描述共同的代码段&#xff0c;并在模块内任意位置被调用&#xff0c;让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算&#xff0c;而任务更像一个过程&a…

GEO生信数据挖掘(一)数据集下载和初步观察

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 GEOquery 简介 安装并加载GEOquery包 getGEO函数获取数据&#xff08;联网下载&#xff09; 更换下载数据源 对数据集进行初步观察处理 GEOquery 简介 GEOquery是一个…