1、函數(shù)指針同樣是可以作為參數(shù)傳遞給函數(shù)的。

#include <iostream>   
#include <string>   
using namespace std;     
int test(int);    
int test2(int (*ra)(int),int); 
void main(int argc,char* argv[])     
  
    cout<<test<<endl; 
    typedef int (*fp)(int);   
    fp fpi; 
    fpi=test;  
    cout<<test2(fpi,1)<<endl;
    cin.get(); 
   
int test(int a) 
  
    return a-1; 

int test2(int (*ra)(int),int b)//這里定義了一個名字為ra的函數(shù)指針 

    int c=ra(10)+b;//在調(diào)用之后,ra已經(jīng)指向fpi所指向的函數(shù)地址即test函數(shù) 
    return c; 
}

2、利用函數(shù)指針,我們可以構(gòu)成指針數(shù)組,更明確點的說法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說可能就容易理解的多了。

#include <iostream>   
#include <string>   
using namespace std; 
void t1(){cout<<"test1";} 
void t2(){cout<<"test2";} 
void t3(){cout<<"test3";} 
void main(int argc,char* argv[])     

    void* a[]={t1,t2,t3}; 
    cout<<"比較t1()的內(nèi)存地址和數(shù)組a[0]所存儲的地址是否一致"<<t1<<"|"<<a[0]<<endl;  
    cout<<a[0]();//錯誤!指針數(shù)組是不能利用數(shù)組下標(biāo)操作調(diào)用函數(shù)的  
    typedef void (*fp)();//自定義一個函數(shù)指針類型 
    fp b[]={t1,t2,t3}; //利用自定義類型fp把b[]定義成一個指向函數(shù)的指針數(shù)組 
    b[0]();//現(xiàn)在利用指向函數(shù)的指針數(shù)組進行下標(biāo)操作就可以進行函數(shù)的間接調(diào)用了; 
    cin.get(); 
}

另外:

void* a[]={t1,t2,t3};
cout<<"比較t1()的內(nèi)存地址和數(shù)組a[0]所存儲的地址是否一致"<<t1<<"|"<<a[0]<<endl;
cout<<a[0]();

上面的這一小段中的錯誤行,為什么不能這么調(diào)用呢?指針數(shù)組元素所保存的只是一個內(nèi)存地址,既然只是個內(nèi)存地址就不可能進行a[0]()這樣地址帶括號的操作,而函數(shù)指針不同,它是一個例外,函數(shù)指針只所以這么叫它就是因為它是指向函數(shù)指向內(nèi)存的代碼區(qū)的指針,它被系統(tǒng)授予允許與()括號操作的權(quán)利,進行間接的函數(shù)調(diào)用,既然函數(shù)指針允許這么操作,那么被定義成函數(shù)指針的數(shù)組就一定是可以一樣的操作的。

 

3、類的成員函數(shù):

class CA
{
 public:
    char lcFun(int a){ return; }
};
CA ca;
typedef char (CA::*PTRFUN)(int);
PTRFUN pFun;
void main()
{
    pFun = CA::lcFun;
    ca.(*pFun)(2);
}

在這里,指針的定義與使用都加上了類限制對象,用來指明指針指向的函數(shù)是那個類的這里的類對象也可以是使用new得到的。比如:
CA *pca = new CA;
pca->(*pFun)(2);
delete pca;
而且這個類對象指針可以是類內(nèi)部成員變量,你甚至可以使用this指針。比如:
CA有成員變量PTRFUN m_pfun;
void CA::lcFun2()

   (this->*m_pFun)(2);
}
一句話,使用類成員函數(shù)指針必須有“->*”“.*”的調(diào)用。