C语言.指针部分知识(函数指针)

函数指针

用法

例:int  (*p)(int a,int b);

用法:p=‘函数名’        //p可当做‘函数名’的函数用(例:  (*p)(a,b)   )

可作为变量输入函数:int Wud(int a,int b,(*p)(int,int) ){        (*p)(a,b);        }

实战案例

用做一个回调函数,相当于传递hal层数据到app层的函数调用

1.定义一个函数指针

typedef void (*KeyEvent_CallBack_t)(KEY_VALUE_TYPEDEF Keys);

2.封装一个赋值指针函数

void hal_KeyScanCBSRegister(KeyEvent_CallBack_t pCBS)
{
	if(KeyScanCBS==0)
	{
		KeyScanCBS = pCBS;
	}
}

3.在app层写一个处理数据的函数

static void KeyEventHandle(KEY_VALUE_TYPEDEF keys)
{
	if((keys==KEY1_CLICK)
		||(keys==KEY2_CLICK)
		||(keys==KEY3_CLICK)
		||(keys==KEY4_CLICK)
		||(keys==KEY5_CLICK)
	  ||(keys==KEY6_CLICK)
		)
	{
		LedMsgInput(LED1,LED_LIGHT,1);
	}
	else if((keys==KEY1_CLICK_RELEASE)
		||(keys==KEY2_CLICK_RELEASE)
		||(keys==KEY3_CLICK_RELEASE)
		||(keys==KEY4_CLICK_RELEASE)
		||(keys==KEY5_CLICK_RELEASE)
	  ||(keys==KEY6_CLICK_RELEASE)
		)
	{
		LedMsgInput(LED1,LED_BLINK4,1);
	}
	else if((keys==KEY1_LONG_PRESS_RELEASE)
		||(keys==KEY2_LONG_PRESS_RELEASE)
		||(keys==KEY3_LONG_PRESS_RELEASE)
		||(keys==KEY4_LONG_PRESS_RELEASE)
		||(keys==KEY5_LONG_PRESS_RELEASE)
	  ||(keys==KEY6_LONG_PRESS_RELEASE)
		)
	{
		LedMsgInput(LED1,LED_DARK,1);
	}
}

4.将app层处理数据的函数赋值入函数指针

hal_KeyScanCBSRegister(KeyEventHandle);

5.在hal层调用函数指针(相当于使用app层的函数)

void hal_KeyProc(void)
{
    //中间省略了其他代码
		if(keys)
		{
			if(KeyScanCBS)
			{
				KeyScanCBS((KEY_VALUE_TYPEDEF) keys);
			}
        }
}

优点与用处

让代码更有序,方便修改和移植,如果未来需要将这个项目的这一模块移植到别的项目上,这就直接在需要调用的函数/模块中调用指针的赋值函数就好了,不需要修改这个模块的代码。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值