久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

函數(shù)指針詳解

 lchjczw 2012-11-22

這篇文章把函數(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ù)都必須嚴(yán)格一致;

 

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,,有兩個const char*類型的參數(shù);

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

將會被編譯器解釋為:

int (*(*ppCmps)[2])(const char*, 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ǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多