最近做项目遇到一个问题。对继电器进行控制,有三个通道,每个通道都表示一个状态,那么总共有8种状态。我们需要8个if-else进行判断或者要用switch结构。后想到一个函数指针数组方法进行判断。
函数指针
在程序中定义了一个函数,在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针。
1)无参
main函数开始两行是对函数指针的声明和使用,因为函数返回值是void,所以指针的类型也为void。赋值的是函数的地址。将void替换为int也是可以的。
2)带参
带参数的就是在调用指针时将参数传进去。
第12行形式是调用函数指针。
回调函数
讲完函数指针,就要讲到回调函数,在有些工程中还是能看到使用回调函数的。这样可以降低耦合。
1)无参
回调就是把函数当做参数传入另一个函数中,另一边形参用函数指针接收。实质上传入的是一个指针
这里要注意function后面参数是函数指针,而且函数指针类型一定要和回调函数的类型要一样,不然会报错。
2)带参
这里注意function里面的形参指针后面也是需要带参的。带参的不是单纯的将后面参数加进去就行,而是需要将需要的参数一起传进去。
函数指针数组
最后说一下函数指针数组,就像之前所说的如果有很多类似的函数,像CallBack1,CallBack2等。如果有三个比特,一共八种情况。例如000,则调用CallBack0, 001 时,调用CallBack1.
那么我们对输入数字要进行很多判断,或者写switch。如果我们使用函数指针数组就不用那么麻烦了。
(* void Fun[8])(void) = {CallBack0,CallBack1,........}
用一个for循环再加一个左移就可以完成操作。
上面里面的void是不能省略的,类型也可以自己定义结构体。