c++指针函数用法

          

                最开始接触到这个应该是在openGL的回调函数里面,当时对这种机制想了很久才明白,但也只是明白机制,具体的实现方法还是不清楚,哈哈哈,今天不小心看到了指针函数的用法,瞬间感觉会爱了!而且也见识到了抽象确实是c++中很重要的思想,实在是太有才了!

                  先贴出代码,然后解释

                   

#include <iostream>
bool IsEven( const int num)
{
	//==符号的优先级比&号的优先级高
	return (num&1) == 0;	//偶数为true,
//	if( num & 1 == 0)
//	std::cout<<"num:"<<num<<std::endl;
//	std::cout<<"测试值:"<<(num & 1) <<std::endl;
//	if(num%2 == 0)

//	if(num & 1)		//&运算
//		return false;
//	return true;
}

void swap(int &num1,int &num2)
{
	int temp = num1;
	num1= num2;
	num2 = temp;
}

void Reorder(int *pData , unsigned int length, bool (*fun)(const int))
{
	//只要使用指针就需要判断指针是否为空,或者无效
	if(pData == NULL ||length <=0)
		return ;
	int *head;
	int *tail; 
	head = pData;
	tail = pData+length-1;
	while(head < tail)
	{
		while(head <tail && !fun(*head) )
			head++;
		while(head <tail && fun(*tail) )
			tail--;
		if(head < tail)		//异常判断
		{
			int temp = *head;
			*head = *tail;
			*tail = temp;
		}
	}
}

int main()
{
	int pData[]={0,1,2,3,4,5};
	int length = sizeof(pData)/sizeof(int);
	Reorder(pData,length,IsEven);
	for(int i=0;i<length;i++)
		std::cout<<pData[i]<<" ";
	std::cout<<std::endl;
	return 0;
}

                  贴出上面的代码,一部分是作为对函数指针的用法的理解,还有一部分就是说对可能考虑到的功能的扩展,IsEven()函数是判断奇偶的,下面的Reorder函数是将数组中的奇数部分都放到前面,偶数部分都放到后面,本来是可以很直接的在Reorder函数里面判断奇偶然后交换,但是如果把需求改一改,需要将数组中所有的负数和非负数分别放在数组的前面和后面,或者3的倍数和非3的倍数分别放到前面和后面,虽然可以直接在Reorder函数中改动,但是如果我们写成上面的形式,定义一个函数指针,就可以直接写出判断分组的标准的函数,即判断负数和非负数,3的倍数或者非3的倍数的函数,然后通过一次调用Reorder函数将判断的分组的函数作为参数传递进去就ok了!顺利的结解决了这个问题,在openGL中同样如此,回调函数中有函数指针,我们定义自己的绘图函数,然后通过回调函数,实现不同的灵活的操作,这个在对不同但相似的功能有了更灵活的解决办法。真心觉得好用!不过同时也强调一定的综合抽象能力。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值