1、函數指針同樣是可以作為參數傳遞給函數的。
#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的函數指針
{
int c=ra(10)+b;//在調用之后,ra已經指向fpi所指向的函數地址即test函數
return c;
}
2、利用函數指針,我們可以構成指針數組,更明確點的說法是構成指向函數的指針數組,這么說可能就容易理解的多了。
#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()的內存地址和數組a[0]所存儲的地址是否一致"<<t1<<"|"<<a[0]<<endl;
cout<<a[0]();//錯誤!指針數組是不能利用數組下標操作調用函數的
typedef void (*fp)();//自定義一個函數指針類型
fp b[]={t1,t2,t3}; //利用自定義類型fp把b[]定義成一個指向函數的指針數組
b[0]();//現在利用指向函數的指針數組進行下標操作就可以進行函數的間接調用了;
cin.get();
}
另外:
void* a[]={t1,t2,t3};
cout<<"比較t1()的內存地址和數組a[0]所存儲的地址是否一致"<<t1<<"|"<<a[0]<<endl;
cout<<a[0]();
上面的這一小段中的錯誤行,為什么不能這么調用呢?指針數組元素所保存的只是一個內存地址,既然只是個內存地址就不可能進行a[0]()這樣地址帶括號的操作,而函數指針不同,它是一個例外,函數指針只所以這么叫它就是因為它是指向函數指向內存的代碼區的指針,它被系統授予允許與()括號操作的權利,進行間接的函數調用,既然函數指針允許這么操作,那么被定義成函數指針的數組就一定是可以一樣的操作的。
3、類的成員函數:
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);
}
在這里,指針的定義與使用都加上了“類限制”或“對象”,用來指明指針指向的函數是那個類的這里的類對象也可以是使用new得到的。比如:
CA *pca = new CA;
pca->(*pFun)(2);
delete pca;
而且這個類對象指針可以是類內部成員變量,你甚至可以使用this指針。比如:
類CA有成員變量PTRFUN m_pfun;
void CA::lcFun2()
{
(this->*m_pFun)(2);
}
一句話,使用類成員函數指針必須有“->*”或“.*”的調用。