免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
函數(shù)指針詳解

這篇文章把函數(shù)指針的各種常用情況做了一個詳解的總結(jié)。

 

1. 指向普通函數(shù)的指針

 

很簡單,如下的例子可以說明基本格式和用法:

  1. int int_add(int a, int b)  
  2. {  
  3.     return (a+b);  
  4. }  
  5. int int_sub(int a, int b)  
  6. {  
  7.     return (a-b);  
  8. }  
  9. int (*int_operator)(intint) = int_add;  
  10.    
  11. int _tmain(int argc, _TCHAR* argv[])  
  12. {  
  13.     cout<<int_operator(4, 5)<<endl; // output 9  
  14.     int_operator = int_sub;  
  15.     cout<<int_operator(4, 5)<<endl; // output -1  
  16.     return 0;  
  17. }  
  18.    
 

 

上例中,int_operator會被編譯器解釋成類型int(*)(int, int)的一個指針。

調(diào)用方式還可以寫作:(*int_operator)(4,5),這樣的好處是讓人一眼就能看到int_operator是一個函數(shù)指針。

注意:函數(shù)指針和指向函數(shù)的返回值的類型和參數(shù)都必須嚴格一致;

 

2. 函數(shù)指針數(shù)組

 

我們還可以聲明一個函數(shù)指針的數(shù)組,比如:

int (*pFuncArray[10])();

[]的優(yōu)先級高于*,該語句將pFuncArray聲明為擁有10個元素的數(shù)組,每一個元素都是指向一個函數(shù)的函數(shù)指針,該函數(shù)沒有參數(shù),返回值類型為int;

 

注意不能寫作:int((*pFuncArray)[10])(),這樣會產(chǎn)生編譯錯誤;

(*pFuncArray)[10]表明了pFuncArray是一個指針,該指針指向一個含有 10個元素的數(shù)組;

其類型為int()(),顯然,編譯不能通過。

 

將上面的聲明轉(zhuǎn)換為typedef格式,會使程序可讀性增加:

typedef int(*pFunc)();

pFunc pFuncArray[10];

如果需要調(diào)用其中的第三個函數(shù),那么調(diào)用方式為:pFuncArray[2]();

 

3. 指向‘函數(shù)指針數(shù)組’的指針

還可以聲明一個指向‘函數(shù)指針數(shù)組’的指針,比如下面的例子代碼:

 


  1. int cmp_len(const char *str1, const char *str2)  
  2. {return ((int)strlen(str1) - (int)strlen(str2));}  
  3. int cmp_str(const char *str1, const char *str2)  
  4. {return strcmp(str1, str2);}  
  5.    
  6. typedef int(*PCMP_FUNC)(const char*, const char*);  
  7.    
  8. PCMP_FUNC pCmpFuncs[2] =  
  9. {  
  10.     cmp_len,  
  11.     cmp_str,  
  12. };  
  13. // 聲明指向pCmpFuncs的指針  
  14. PCMP_FUNC (*ppCmps)[2] = &pCmpFuncs;  

 

 

聲明分解說明如下:

(*ppCmps):表明ppCmps是一個指針;

(*ppCmps)[2]:后面緊跟[2],表明ppCmps是一個指向‘兩個元素數(shù)組’的指針

PCMP_FUNC表明了該數(shù)組元素的類型,它是指向函數(shù)的指針,返回值為int,有兩個constchar*類型的參數(shù);

實際上語句PCMP_FUNC (*ppCmps)[2] = &pCmpFuncs;

將會被編譯器解釋為:

int(*(*ppCmps)[2])(constchar*, const char*) = &pCmpFuncs;

聲明分解:

(*ppCmps):表明ppCmps是一個指針;

(*ppCmps)[2]:后面緊跟[2],表明ppCmps是一個指向‘兩個元素數(shù)組’的指針

int (*)(const char*, const char *):表明了該數(shù)組元素的類型,它是指向函數(shù)的指針,返回值為int,有兩個const char*類型的參數(shù);

 

3. 函數(shù)指針與類

 

C++語言中,使用函數(shù)指針可以指向類的一個成員函數(shù)或變量,雖然這種用法很少能用到,至少我是沒有用過,不過了解一下還是有點必要的。

為了支持這類指針,C++有三個特殊的運算法符:::*,.->.*;

指向成員函數(shù)的指針必須與向其賦值的函數(shù)類型匹配,這包括:1)參數(shù)的類型和個數(shù);2)返回值類型;3)它所屬的類型;

指向成員變量的指針必須與向其賦值的變量類型匹配,這包括:1)變量類型;2)它所屬的類型;

成員函數(shù)和變量必須被綁定到一個對象或者指針上,然后才能得到調(diào)用對象的this指針,然后才能指向成員變量或函數(shù);

AClass的成員變量int m_iValue,其完整類型是:int型的類AClass的成員m_iValue

AClass的成員函數(shù)int Add(int),其完整類型是:返回值為int型,帶一個int類型參數(shù)的類AClass的成員Add

 

注意:指向類的靜態(tài)變量或靜態(tài)成員函數(shù)的指針和普通成員不同;

 

3.1 指向類成員變量的指針

 

有了上面的一些說明,看下面的例子就很容易理解了;

.* 是一個新的操作符,表明是指向成員操作符的指針(另一個是->*,是指針對象的調(diào)用方式)

 

 

  1.    
  2. class AClass  
  3. {  
  4. public:  
  5.     void Add(int a){m_iValue += a;}  
  6.     int  m_iValue;  
  7. };  
  8. int _tmain(int argc, _TCHAR* argv[])  
  9. {  
  10.     AClass a;  
  11.    // 聲明并指向AClass的一個成員變量的指針  
  12.     int AClass::*pValue = &AClass::m_iValue;  
  13.     // 或者如下方式:  
  14.     // int AClass::*pValue;// 指針變量聲明  
  15.     // pValue = &AClass::m_iValue;// 指向A的m_iValue成員  
  16.     a.*pValue = 4; // 使用方式,賦值  
  17.     cout<<a.m_iValue<<endl; // 輸出4  
  18.     return 0;  
  19. }  
 

3.2 指向類成員函數(shù)的指針

 

有了上面的一些說明,看下面的例子就很容易理解了;

下面的例子中,注意調(diào)用方式:(a.*pAAdd)(5);不能寫作a.*pAAdd(5);

因為操作符()的優(yōu)先級是高于.*的因此,它將被解釋為a.*(pAAdd(5));顯然這是不被支持的。

 

  1.    
  2. class AClass  
  3. {  
  4. public:  
  5.     void Add(int a){m_iValue += a;}  
  6.     int  m_iValue;  
  7. };  
  8. // 指向類AClass成員函數(shù)的指針的聲明方式  
  9. typedef void (AClass::*pAFunc)(int);  
  10. // 聲明一個指向AClass::Add()的函數(shù)指針  
  11. pAFunc pAAdd = &(AClass::Add);  
  12.    
  13. int _tmain(int argc, _TCHAR* argv[])  
  14. {  
  15.     AClass a;  
  16.     // 聲明并指向AClass的一個成員變量的指針  
  17.     int AClass::*pValue = &AClass::m_iValue;  
  18.     // 或者如下方式:  
  19.     // int AClass::*pValue;// 指針變量聲明  
  20.     // pValue = &AClass::m_iValue;// 指向A的m_iValue成員  
  21.     a.*pValue = 4; // 使用方式,賦值  
  22.     cout<<a.m_iValue<<endl; // 輸出  
  23.     (a.*pAAdd)(5); // 指向成員函數(shù)指針的調(diào)用方式  
  24.     cout<<a.m_iValue<<endl; // 輸出  
  25.     return 0;  
  26. }  
 



3.3 指向類靜態(tài)成員的指針

 

類的靜態(tài)成員屬于該類的全局對象和函數(shù),并不需要this指針;因此指向類靜態(tài)成員的指針聲明方式和普通指針相同。

該類指針和普通指針的聲明和調(diào)用方式完全相同;唯一的不同就是設(shè)置指向的對象時,仍然需要類信息,這一點和指向普通成員的指針相同。

下面的例子可以說明使用方式。

 

 

  1. class AClass  
  2. {  
  3. public:  
  4.     static void Add(int a){m_iValue += a;}  
  5.     static int  m_iValue;  
  6. };  
  7. int AClass::m_iValue;  
  8.    
  9. typedef void(*pAAdd)(int);  
  10.    
  11. int _tmain(int argc, _TCHAR* argv[])  
  12. {  
  13.     // 聲明并指向AClass的一個靜態(tài)成員變量的指針  
  14.     int *pValue = &AClass::m_iValue;  
  15.     // 或者如下方式:  
  16.     // int *pValue;// 指針變量聲明  
  17.     // pValue = &AClass::m_iValue;// 指向A的m_iValue成員  
  18.     *pValue = 4; // 使用方式同普通指針,賦值  
  19.     cout<<*pValue<<endl; // 輸出  
  20.     pAAdd p = &AClass::Add;  
  21.     p(5); // 調(diào)用方式同普通函數(shù)指針  
  22.     cout<<*pValue<<endl; // 輸出  
  23.     return 0;  

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++中那些令人蛋疼的帶const形參的重載函數(shù)
C++類對應(yīng)的內(nèi)存結(jié)構(gòu)
C++類的大小——sizeof()
const用法總結(jié)(基本全了)
測試你的c語言程度
函數(shù)內(nèi)部的對象的生存期 用new 與不用new
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服