当前位置:首页 > 编程笔记 > 正文
已解决

函数指针与回调函数

来自网友在路上 162862提问 提问时间:2023-09-27 18:52:16阅读次数: 62

最佳答案 问答题库628位专家为你答疑解惑

(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,这就形成了回调。

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"函数指针与回调函数":http://eshow365.cn/6-14809-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!