0.基本的函数指针的声明与初始化

首先我们来声明一个函数。

int Max_Int(int a, int b)
{return (a>b)?a:b;
}

把函数名替换成指针表达式是创建指向函数指针最简单的方式:

int (*pFun)(int a, int b);    //声明函数指针,此时函数指针没有指向任何函数

这时,我们就已经完成了一个最简单的函数指针声明,其意义是:生命了一个函数指针,其指向的函数返回一个int值,带有两个int型参数。

接下来我们对函数指针进行初始化:

pFun = Max_Int;         //使函数指针指向Max_Int函数

这样就完成了函数指针的初始化。接下来,我么就可以通过此函数指针引用此函数。

int max;
int m = 5;
int n = 8;
max = (*pFun)(m,n);                //使用函数指针引用Max_Int函数
max = pFun(m,n);               //与上一句效果完全相同
printf(“The max value is %d\n”, max);   //print ‘8’

PS:第四和第五句效果完全相同,编译器都认识。

1、更高级的声明方式:

1)使用typedef声明函数指针。

我们可以使用typedef来声明函数,以使代码的可读性更强。

typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);

通过之前的介绍,我们可以知道,此函数指针可以指向“返回bool型,带int, unsigned int, unsigned short, unsigned int*, bool型参数” 的函数。

借此声明,我们可以像声明变量那样同时创建多个函数指针。

pCopySDMMC2Mem  pf1, pf2;

2)使用define来定义函数指针

#define CopySDMMCtoMem(z,a,b,c,e)(((bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned int *)0xD0037F98)))(z,a,b,c,e))

效果同上,但指定了指向函数的入口地址(0xD0037F98)

2.函数指针的两个典型应用

1)将函数作为参数传递给函数(此部分转自https://blog.csdn.net/yuexiang321/article/details/52658947)

相信,大家中学的时候都学过积分这个鬼东西。不知道还记不记得积分最原始的计算方法。

对,没错,无限细分,求面积。好的。我们接下来就给大家一个应用函数指针有关积分计算的例子。

直接贴出代码。

#include <stdio.h>  //Calculate用于计算积分。一共三个参数。第一个为函数指针func,指向待积分函数。二三参数为积分上下限
double Calculate(double(*func)(double x), double a, double b)
{  double dx = 0.0001;//细分的区间长度  double sum = 0;  for (double xi = a+dx; xi <= b; xi+=dx)  {  double area = func(xi)*dx;  sum +=area;  }  return sum;
}  double func_1(double x)
{  return x*x;
}  double func_2(double x)
{  return x*x*x;
}  void main()
{  printf("%lf\n", Calculate(func_1, 0, 1));  printf("%lf\n", Calculate(func_2, 0, 1));
}  

通过函数指针,我们可以在函数中使用别的函数作为参数。此程序可以完成对不同函数的积分。

2)引用不在代码段中的函数

此功能在嵌入式系统中经常使用。我们知道,我们写的用户程序的code是存放在代码段中的,在嵌入式系统中,一般情况下是存放在flash中的。什么叫不在代码段中的函数?很多微控制器在出厂前会将一些功能函数(系统函数)固化在rom中(类似于PC机中的BIOS),如Flash擦写功能,Flash Copy功能。而我们写的代码是不认识这些函数的,不能直接使用函数名调用。所以,当我们想在用户程序中调用这些系统函数时,就只能使用函数指针的方式,通过将系统函数的入口地址传给函数指针,来达到调用rom中程序的目的。这些系统函数一般都会在官方手册中给出功能,返回值类型和参数列表。

下面是从三星的S5PV210_applicationnote中截取的一个系统函数。

从上我们可以分析出,此系统函数的入口地址为0xD0037F98。返回bool型,带有int, unsigned int, unsigned short, unsigned int*, bool型五个参数。实际使用时,我们可以如下调用:

// 实际使用时
pCopySDMMC2Mem p1 = (pCopySDMMC2Mem)0xD0037F98;
p1(x, x, x, x, x);

传入五个合适的参数即可。

分析函数指针及其两个主要用途相关推荐

  1. C++入门经典-例6.14-通过指针连接两个字符数组

    1:字符数组是一个一维数组,引用字符数组的指针为字符指针,字符指针就是指向字符型内存空间的指针变量. char *p; char *string="www.mingri.book" ...

  2. 将一个指针 free 两次之后会发生什么?

    0x00 简介 在入门 c 语言时我们都知道一个常识:通过 malloc() 动态申请的内存在使用完之后需要通过 free() 释放:那么如果因为程序设计不当,导致这块堆内存释放之后,再释放一次会发生 ...

  3. c语言指针输出两个数的最大值和最小值,并求和,有些不清楚这样写为什么不行。

    网上看到一个帖子,居然自己找不出原因. c语言指针输出两个数的最大值和最小值,并求和,有些不清楚这样写为什么不行. #include<stdio.h> int main() {     i ...

  4. c语言用指针两个字母交换,c语言指针基础之用指针交换两个数(代码实例)

    用指针交换两个数: void swap(int *p,int *q) { int temp; temp = *p; *p = *q; *q = temp; } int main() { int a = ...

  5. arrays中copyof复制两个数组_C语言100题集合026-使用指针交换两个数组中的最大值

    系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...

  6. using 关键字有两个主要用途

    转自:https://www.jianshu.com/p/5357dc4efcf8 using 关键字有两个主要用途: (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型. (二) ...

  7. 用指针交换两个数_C语言100题集合026-使用指针交换两个数组中的最大值

    系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...

  8. 一个星号的指针和两个星号的有什么区别

    typedef struct jilu {     char *value;     struct jilu *next; }JL; JL * head = NULL; JL ** p, *q; // ...

  9. C++的指针的坑:“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起...

    原文地址:http://www.cppblog.com/vczh/archive/2013/04/27/199765.html posted on 2013-04-27 17:24 陈梓瀚(vczh) ...

最新文章

  1. Typo域名测试工具urlcrazy大学霸IT达人
  2. python学会了能做什么-学会Python后都能做什么?介绍五种Python的实用场景
  3. php 支付宝订单查询_5. PHP接入支付宝单笔订单查询接口
  4. 新近碰到的病毒(TR.Spy.Babonock.A)
  5. Socket 死连接详解
  6. 星辰大海:华为用“鲲鹏+昇腾”计算双擎再出发
  7. Maven Install报错:Perhaps you are running on a JRE rather than a JDK
  8. java pgp加密_如何解密PGP加密文件(由两个PGP密钥加密.Key1具有公钥,私钥.Key2只有公钥)通过JAVA API...
  9. Java 多线程详解(三)------线程的同步
  10. 排序算法2:冒泡排序
  11. drool 7.x 语法和属性
  12. 计算机专业专转本题目(新考纲)
  13. 字符集 (ASCII、GBK、UTF-8、编码方案,解码方案、乱码等问题)
  14. 【自动驾驶】KITTI Road Detection Benchmark Devkit_road使用
  15. 28种美女最漂亮的拍照姿势
  16. uniapp使用canvas画海报二维码
  17. 「浏览器插件」无广告国内视频平台直接播放插件
  18. easyCVR接入华为Vpaas(VCN/IVS) GB28181记录
  19. 实现Torchlight(火炬之光)的背包UI效果
  20. D3DCompiler_47.dll丢失怎么解决-D3DCompiler_47.dll丢失怎么办

热门文章

  1. 《阿里巴巴Android开发手册》正式发布,安卓开发者的福音
  2. python playsound安装_ python音频库:Windows下pydub安装配置、过程出现的问题及常用API ...
  3. 魅族应用市场之--自动化测试Umeng分享报错
  4. 虚拟机三种虚拟网络的区别
  5. PCA(主成分分析)原理详解
  6. 深圳样板间vr全景拍摄制作发挥
  7. 51单片机矩阵键盘扫描及使用方法
  8. Android进阶——Android跨进程通讯机制之Binder、IBinder、Parcel、AIDL
  9. 从项目中学习Django 天天生鲜---------订单
  10. 新学Python之学习官网教程序言