函数指针的应用

1.函数指针的定义

函数指针通常会与指针函数混淆,指向函数的指针叫做函数指针,而指针函数表示函数的返回值为指针的函数。

2.函数指针的表达

(1)int (*func1)(int , int );//此处定义了一个函数指针,其返回值为int型;

(2)int* func1(int, int);    //此处定义了一个指针函数,其返回值为int型的指针;

3.函数指针的使用;

一般函数指针主要用于回调函数,当底层的函数需要调用到上层的函数时,可以通过注册回调函数的方法来实现。


#include "stdafx.h"

/*
* This source file is create by zjs to test function
*/

#define VALID_BUF_LEN 20


#define REG_CALL_BACK_NUM 4
#define REG_CALL_BACK_ADD_FUNC 0
#define REG_CALL_BACK_SUB_FUNC 1
#define            REG_CALL_BACK_AVER_FUNC  2


typedef int (*register_func)(int, int *); //函数指针

register_func func[REG_CALL_BACK_NUM] = { NULL };


int value_buf[VALID_BUF_LEN] = {};


int cal_param_add(int a, int *b)
{
int sum;
sum = a + *b;
printf("sum = %d\n", sum);
return 0;
}


int cal_param_sub(int a, int *b)
{
int sub = 0;
sub = a - *b;
printf("sub = %d\n", sub);
return 0;
}


int cal_param_aver(int len, int *buf) {


int cnt = 0;
int aver = 0;
if (len == 0) {
printf("Error, len must be larger than zero");
return -1;
}


while (cnt <= len) {
aver += buf[cnt++];
}
aver = aver / len;
printf("buf aver = %d\n", aver);
return 0;
}


int register_callback_func(int seq, register_func function)
{
if (seq >= REG_CALL_BACK_NUM) {
printf("Register func has been Larger than REG_CALL_BACK_NUM");
}

func[seq] = function;
return 0;
}




int main()
{
for (int i = 0; i < VALID_BUF_LEN; i++) {
value_buf[i] = i;
}


int a = 10;
int b = 5;

register_callback_func(REG_CALL_BACK_ADD_FUNC, cal_param_add);
register_callback_func(REG_CALL_BACK_SUB_FUNC, cal_param_sub);
register_callback_func(REG_CALL_BACK_AVER_FUNC, cal_param_aver);

func[REG_CALL_BACK_ADD_FUNC](a, &b);
func[REG_CALL_BACK_SUB_FUNC](a, &b);
func[REG_CALL_BACK_AVER_FUNC](VALID_BUF_LEN, value_buf);

        return 0;
}


运行结果如下:

函数指针的应用