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++-函数与指针的关系(回调函数)的更多相关文章

  1. javascript 函数初探 (四)--- 回调函数

    回调函数 既然函数与任何被赋值给变量的数据是相同的,那么她当然可以像其他数据那样被定义.删除.拷贝,以及当成参数传递给其它函数. 我们定义一个函数,这个函数有两个函数类型的参数,然后他会分别执行这两个 ...

  2. jquery动画函数里面可以跟一个回调函数,表示动画结束后执行的代码

    jquery动画函数里面可以跟一个回调函数,表示动画结束后执行的代码 使用js监听动画结束后进行的操作: $ele.fadeIn(300,function(){...}) $ele.fadeOut(3 ...

  3. C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子

    先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...

  4. 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底

    为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> usi ...

  5. socket.io笔记二之事件监听回调函数接收一个客户端的回调函数

    //服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...

  6. js中函数的使用方式及回调函数

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 函数的参数是函数,函数中Ajax返回的回调函数中的函数运行

    调用函数 checkAjax('addrinfo',formdata,vzxcv); 函数checkAjax function checkAjax(url,formdata,call_back){ / ...

  8. Error:指向绑定函数的指针只能用于调用函数

    a1.determinant; 改为: a1.determinant(); Eigen::MatrixXd a1(,);//ImagePoint a1<<n1,p1,n2,p2; doub ...

  9. 函数返回指针类型(strchr函数)

    #include<stdio.h> #include<string.h> char *mystrchr(char *s,char c) { while(*s) { if(*s ...

随机推荐

  1. day7 基础数据类型&集合&深浅拷贝

    基础数据类型汇总: #!/usr/bin/env python # -*- coding:utf-8 -*- ''' str int ''' # str s = ' a' print(s.isspac ...

  2. 简单java web制作思路

    经过俩天的摸索,和学姐的帮助下终于做出来一个简单地网页版的学生信息添加的系统.接下来说一下答题的思路: 首先我个人习惯先做网页界面,创建3个jsp文件分别是添加界面,成功界面,失败界面.这件看起来更加 ...

  3. Cows Of The Round Table【DFS】

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAz0AAAKiCAIAAABzTSUAAAAgAElEQVR4Aey9C5RnWVXff4GBUR6j8u ...

  4. PAT (Advanced Level) Practice 1008 Elevator (20 分) (模拟)

    The highest building in our city has only one elevator. A request list is made up with N positive nu ...

  5. 【你不知道的javaScript 上卷 笔记7】javaScript中对象的[[Prototype]]机制

    [[Prototype]]机制 [[Prototype]]是对象内部的隐试属性,指向一个内部的链接,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就 会继续在 [[Prototyp ...

  6. MySQL进阶之索引

    一.索引的本质: 数据库查询是数据库的最主要的功能之一,数据库系统的设计者从查询算法的角度对数据库进行了一定的优化. 最基本的顺序查找算法的复杂度为O(n),在数据量很大的时候算法的效率是很低的.虽然 ...

  7. 【巨杉数据库SequoiaDB】巨杉数据库荣获《金融电子化》“金融科技创新奖”

    巨杉助力金融科技创新 2019年12月19日,由<金融电子化>杂志社主办.北京金融科技产业联盟协办的“2019中国金融科技年会暨第十届金融科技及服务优秀创新奖颁奖典礼”在京成功召开.来自金 ...

  8. vue加载单文件使用vue-loader报错

    报错信息如下:ERROR in ./src/login.vue Module Error (from ./node_modules/vue-loader/lib/index.js): vue-load ...

  9. Python-Django学习笔记(二)-创建一个Django项目与应用

    1.创建一个Django项目 打开cmd命令行,设置好工作目录(cd 目录路径),然后输入 django-admin startproject projectname #必须安装好Django才可以执 ...

  10. 跨域 node git

    promise 异步回调地狱:就是多个异步请求嵌套的表现 瑕疵:后期维护难 解决:通过promise技术 什么是promise:就是一种异步编程的解决方案 有三个状态:进行中.成功了,失败了 var ...