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)用。