上次看Atmel的示例工程,发现人家使用了函数指针的结构体(函数指针结构体)。感叹人家的C语言功夫审核,自己费劲还是只能读懂的份。不过,函数指针确实好用。今天就试试这个超牛的东西。Now let's see how function pointers can help us.

实验前,了解下函数指针的定义方法。(来自百度百科的说明

函数指针的声明方法为:

函数类型 (标志符指针变量名) (形参列表);

注1:“函数类型”说明函数的返回类型,“(标志符指针变量名 )”中的括号不能省,若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x); /* 声明一个函数 */

void (*f) (int x); /* 声明一个函数指针 */

f=func; /* 将func函数的首地址赋给指针f */

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

注2:函数括号中的形参可有可无,视情况而定

第二步,准备实验环境。

MDK473+STM32F4.其实没有必要在开发板中试,只是刚好我手上有这么个开发环境,就不去配置别的东西了。

第三步,开始写代码:

1、写两个功能不同参数类型一样的函数。

这里我写了两个函数:

uint8_t max1(uint8_t x,uint8_t y)
{
return x>y?x:y;
}
uint8_t max2(uint8_t x,uint8_t y)
{
if(x>y)
return x;
else
return y;
}

两个函数一样的功能。

2、一个函数指针,映射其中的一个函数  看输出。之后映射到第二个函数看输出

实现步骤

int main(void)
{
mymax = &max1;
mymax(3,5); mymax = &max2;
mymax(4,6); while (1)
{
}
}

之后但不跟踪进去看看,会发现两个max函数都执行了。

还有一种是将函数指针弄成一个数组的形式。数组的成员都是函数指针。这种写法特别适合做接口程序。比如我先前博客里边提到的Atmel的(函数指针结构体)。底层函数和上层函数分开来的效果,是当底层硬件改变之后,只写相应的接口函数就可以挂在到原来的大程序中。比重新写要简单很多。

以下是函数指针数组的实验:

继续使用上边的两个max函数。因为函数的返回类型是相同的,所以可以定义成数组。定义的时候只需要注意书写的格式就行了:

int main(void)
{
uint8_t (*myFun[2])(uint8_t,uint8_t);
 myFun[0] = max1;
myFun[1] = max2; myFun[0](2,4);
myFun[1](5,2);
}

运行下,可以看到两个max依此都执行了。

其实函数名就是个指针,指向了函数的入口地址。函数的参数什么的,是函数名后边的一段空间,可以有也可以没有。跟这个指针没什么必然联系。

最新文章

  1. QSS的应用
  2. 使用ArcGIS JavaScript API 3.18 加载天地图
  3. 【前端】移动端Web开发学习笔记【2】 & flex布局
  4. EventBus的简单使用与原理
  5. NOIP模拟赛-旅行者问题 解题报告
  6. php常见知识
  7. 关于使用"/"来 dispatcherServlet 的url-pattern带来的问题
  8. BZOJ1579 [Usaco2009 Feb]Revamping Trails 道路升级
  9. 12.Object-C--浅谈OC的内存管理机制
  10. Table of Contents - Spring
  11. 编写一个单独的Web Service for Delphi7(步骤)
  12. C# Double类型 不四舍五入
  13. H - Prince and Princess - HDU 4685(二分匹配+强连通分量)
  14. Java-对象排序
  15. H5学习之旅-H5与Php交互(12)
  16. Python初始环境搭建和Pycharm的安装
  17. 在spring中如何生成一个bean (一个对象,比如jedis的连接池对象)【我】
  18. Ubuntu/Debian 8 安装 Intel realsense 摄像头驱动
  19. Python3正则表达式(4)
  20. Microsoft Active Directory(LDAP)连接常见错误代码

热门文章

  1. Java随笔一
  2. Android上传图片到服务器
  3. ListView到顶部不可再拉
  4. Java高级规范之四
  5. 《一个 Go 程序系统线程暴涨的问题》结论
  6. yii accessRules用法
  7. JavaScript 获取数组中最大值、最小值
  8. Spring Boot 框架@Temporal(TemporalType.DATE)
  9. 设置jdk的编码
  10. 将内存ffff:0~ffff:b中的数据拷贝到0:200~0:20b中