C++-函数与指针的关系(回调函数)
1、函数类型
C语言中的函数有自己特定的类型
函数的类型由返回值,参数类型和参数个数共同决定
★ int add(int i, int j)的类型为int(int, int)
C语言中通过typedef为函数类型重命名
★ typedef type name(parameter list) //name就是重命名的名字
例:
typedef int f(int, int); //重命名为f
typedef void p(int); //重命名为p
2、函数指针
函数指针用于指向—个函数
函数名是执行函数体的入口地址
可通过函数类型定义函数指针: FuncType* pointer; //FuncType是重命名的函数名
也可以直接定义: type (*pointer)(parameter list); //定义函数指针
- pointer为函数指针变量名
- type为所指函数的返回值类型
- parameter list为所指函数的参数类型列表
为何要定义函数指针呢?直接用函数名不就行了吗?
面试小问题:
如何使用C语言直接跳转到某个固定的地址开始执行?
我们只知道goto语句可以跳转到某个固定地址,但goto我们肯定是不能用的,那么我们就只能使用函数指针来使用了。
#include <stdio.h>
typedef int(FUNC)(int); //重命名 int (int) 类型
int test(int i) //
{
return i * i;
}
void f()
{
printf("Call f()...\n");
}
int main()
{
FUNC* pt = test; //函数指针pt,用test初始化
void(*pf)() = &f; //pf也是函数指针,没有通过typedef,函数取不取地址是一样的,与数组不一样
printf("pf = %p\n", pf); //三个都一样
printf("f = %p\n", f);
printf("&f = %p\n", &f);
pf();
(*pf)(); //对应老式的写法等价于 f(),支持
printf("Function pointer call: %d\n", pt(2)); //4
return 0;
}
5、回调函数
回调函数是利用函数指针实现的一种调用机制
回调机制原理
-调用者不知道具体事件发生时需要调用的具体函数
-被调函数不知道何时被调用,只知道需要完成的任务
-当具体事件发生时,调用者通过函数指针调用具体函数
回调机制中的调用者和被调函数互不依赖
#include <stdio.h>
typedef int(*Weapon)(int);
void fight(Weapon wp, int arg)
{
int result = 0;
printf("Fight boss!\n");
result = wp(arg);
printf("Boss loss: %d\n", result);
}
int knife(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Knife attack: %d\n", 1);
ret++;
}
return ret;
}
int sword(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Sword attack: %d\n", 5);
ret += 5;
}
return ret;
}
int gun(int n)
{
int ret = 0;
int i = 0;
for(i=0; i<n; i++)
{
printf("Gun attack: %d\n", 10);
ret += 10;
}
return ret;
}
int main()
{
fight(knife, 3);
fight(sword, 4);
fight(gun, 5);
return 0;
}
7、小结
C语言中的函数都有特定的类型
可以使用函数类型定义函数指针
函数指针是实现回调机制的关键技术
通过函数指针可以在C程序中实现固定地址跳转
C++-函数与指针的关系(回调函数)的更多相关文章
- javascript 函数初探 (四)--- 回调函数
回调函数 既然函数与任何被赋值给变量的数据是相同的,那么她当然可以像其他数据那样被定义.删除.拷贝,以及当成参数传递给其它函数. 我们定义一个函数,这个函数有两个函数类型的参数,然后他会分别执行这两个 ...
- jquery动画函数里面可以跟一个回调函数,表示动画结束后执行的代码
jquery动画函数里面可以跟一个回调函数,表示动画结束后执行的代码 使用js监听动画结束后进行的操作: $ele.fadeIn(300,function(){...}) $ele.fadeOut(3 ...
- C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子
先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...
- 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底
为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> usi ...
- socket.io笔记二之事件监听回调函数接收一个客户端的回调函数
//服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...
- js中函数的使用方式及回调函数
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 函数的参数是函数,函数中Ajax返回的回调函数中的函数运行
调用函数 checkAjax('addrinfo',formdata,vzxcv); 函数checkAjax function checkAjax(url,formdata,call_back){ / ...
- Error:指向绑定函数的指针只能用于调用函数
a1.determinant; 改为: a1.determinant(); Eigen::MatrixXd a1(,);//ImagePoint a1<<n1,p1,n2,p2; doub ...
- 函数返回指针类型(strchr函数)
#include<stdio.h> #include<string.h> char *mystrchr(char *s,char c) { while(*s) { if(*s ...
随机推荐
- expect: spawn id exp6 not open while executing "expect eof"
1.expect是基于tcl演变而来的,所以很多语法和tcl类似 基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说spa ...
- MySQL基础入门使用和命令的使用
数据库了解 概念 数据库就是一种特殊的文件,其中存储着需要的数据 一个数据库可以有多张表 MySQL是一种关系型数据库 具有关联性数据的就是关系型数据库 MySQL是一种软件可以用来创建mysql数据 ...
- 【37】池化层讲解(Pooling layers)
池化层(Pooling layers) 除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一下. 先举一个池化层的例子,然后我们再讨论池化层的 ...
- 11、C++之const类成员变量,const成员函数
//转载 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 cons ...
- Python第三方库requests的编码问题
PS:这个解决方法可能很简单,但是这是平时的一些细节问题,所以有必要提醒一下! 首先代码不多,就是通过get方法去获取豆瓣首页信息,如图:但是会报UnicodeEncodeError: 'gbk' c ...
- ubuntu下opencv CMakeLists.txt编写
# 声明要求的 cmake 最低版本 cmake_minimum_required( VERSION 2.8 ) # 声明一个 cmake 工程 project( pro ) # 设置编译模式 set ...
- Bonny校园app使用体验
Bonny校园是一款集校园表白墙.失物招领处和二手市场集一体的一款校园app,旨在帮助大学生解决校内的生活问题.这款app功能比较齐全,表白墙内含有许多有趣的信息展示,失物招领处内可以详细的展示捡到东 ...
- php外挂python脚本抓取ajax数据
之前我写过一遍php外挂python脚本处理视频的文章.今天和大家分享下php外挂python实现输入关键字搜索的脚本 首先我们先来分析一波网站: http://www.dzdpw.com/s.php ...
- JavaScript - request封装
request封装--微信小程序使用async,await ES5 参考代码 var request = function(param){ var _this = this; $.ajax({ typ ...
- C++ STL:next_permutation和prev_permutation
两个函数都在#include <algorithm>里 顾名思义,next_permutation用来求下一个排列,prev_permutation用来求上一个排列. 当前的排列不满足函数 ...