随笔 - 132  文章 - 51  trackbacks - 0
<2012年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

文章档案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新评论

阅读排行榜

评论排行榜

程序中不可避免的使用函数指针,各种回调,加强一下理解

(一)定义函数指针

//形式1:返回类型(*函数名)(参数表)

// PFN是函数指针
char (*PFN)(int);  

char gpfn(int val)
{
 cout << val << endl;
 return 1;
}


void main()
{
    pFun 
= glFun;
    (
*pFun)(2);
}


PFN是一个函数指针 指向char(*)(int)类型的函数指针,这种函数参数是一个int,返回类型是一个char,如果要对它赋值,需要参数和返回类型一致

 第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。

(二)赋值和调用
赋值

    // 赋值方法1 (常用 )
    PFN = gpfn;                    // 函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址

    
// 赋值方法2
    PFN = &gpfn;
调用
    // 调用方法1 
    PFN(10);

    
// 调用方法2 ( 常用)
    (*PFN)(20);

 

这两种方法都可用,C++primer上有说明


(三)常见的函数指针的应用

标准模板库中的排序啊, 比较啊 都会常用的函数指针
比如我们定义了结构体 FightAttr记录了战斗的一些数据,比如连击次数, 战斗得分... 我们只记录了每个人的FightAttr, 如何对他们排序呢
struct FightAttr
{
   Combo combo;
   Score  score;
  ....
};

可以用sort 等排序 

template<class RandomAccessIterator, class Predicate>
   
void sort(
      RandomAccessIterator first, 
      RandomAccessIterator last, 
      Predicate comp
   );

sort允许使用自己定义的比较函数(第三个参数)

// 比较连击
bool compareCombo(const FightAttr& a, const FightAttr& b)
{
  
return a.combo < b.combo;
}


// 比较分数
bool compareScore(const FightAttr& a, const FightAttr& b)
{
  
return a.score< b.score;
}





参考blog:

C++指针探讨 (一)数据指针

http://www.cnblogs.com/ly4cn/archive/2005/11/28/286185.html

C++指针探讨 (二) 函数指针

http://ly4cn.cnblogs.com/archive/2005/12/17/299007.html


 

posted on 2012-08-01 08:15 风轻云淡 阅读(371) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理