C++学习笔记03 函数指针

C++学习笔记03 函数指针

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

(一)定义函数指针

// 形式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


 

你可能感兴趣的:(C++学习笔记03 函数指针)