C语言函数指针实验
上次看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依此都执行了。
其实函数名就是个指针,指向了函数的入口地址。函数的参数什么的,是函数名后边的一段空间,可以有也可以没有。跟这个指针没什么必然联系。
最新文章
- QSS的应用
- 使用ArcGIS JavaScript API 3.18 加载天地图
- 【前端】移动端Web开发学习笔记【2】 &; flex布局
- EventBus的简单使用与原理
- NOIP模拟赛-旅行者问题 解题报告
- php常见知识
- 关于使用";/";来 dispatcherServlet 的url-pattern带来的问题
- BZOJ1579 [Usaco2009 Feb]Revamping Trails 道路升级
- 12.Object-C--浅谈OC的内存管理机制
- Table of Contents - Spring
- 编写一个单独的Web Service for Delphi7(步骤)
- C# Double类型 不四舍五入
- H - Prince and Princess - HDU 4685(二分匹配+强连通分量)
- Java-对象排序
- H5学习之旅-H5与Php交互(12)
- Python初始环境搭建和Pycharm的安装
- 在spring中如何生成一个bean (一个对象,比如jedis的连接池对象)【我】
- Ubuntu/Debian 8 安装 Intel realsense 摄像头驱动
- Python3正则表达式(4)
- Microsoft Active Directory(LDAP)连接常见错误代码