1. 指向普通函式的指標
很簡單,如下的例子可以說明基本格式和用法:
int int_add(int a, int b)
int int_sub(int a, int b)
int (*int_operator)(int, int) = int_add;
int _tmain(int argc, _tchar* argv)
上例中,int_operator會被編譯器解釋成型別int(*)(int, int)的乙個指標。
呼叫方式還可以寫作:(*int_operator)(4, 5),這樣的好處是讓人一眼就能看到int_operator是乙個函式指標。
注意:函式指標和指向函式的返回值的型別和引數都必須嚴格一致;
2. 函式指標陣列
我們還可以宣告乙個函式指標的陣列,比如:
int (*pfuncarray[10])();
的優先順序高於*,該語句將pfuncarray宣告為擁有10個元素的陣列,每乙個元素都是指向乙個函式的函式指標,該函式沒有引數,返回值型別為int;
注意不能寫作:int ((*pfuncarray)[10])(),這樣會產生編譯錯誤;
(*pfuncarray)[10]表明了pfuncarray是乙個指標,該指標指向乙個』含有 10個元素的陣列』;
其型別為int()(),顯然,編譯不能通過。
將上面的宣告轉換為typedef格式,會使程式可讀性增加:
typedef int(*pfunc)();
pfunc pfuncarray[10];
如果需要呼叫其中的第三個函式,那麼呼叫方式為:pfuncarray[2]();
3. 指向『函式指標陣列』的指標
還可以宣告乙個指向『函式指標陣列』的指標,比如下面的例子**:
int cmp_len(const
char *str1, const
char *str2)
int cmp_str(const
char *str1, const
char *str2)
typedef
int(*pcmp_func)(const
char*, const
char*);
pcmp_func pcmpfuncs[2] =
; // 宣告指向pcmpfuncs的指標
pcmp_func (*ppcmps)[2] = &pcmpfuncs;
宣告分解說明如下:
(*ppcmps):表明ppcmps是乙個指標;
(*ppcmps)[2]:後面緊跟[2],表明ppcmps是乙個指向『兩個元素陣列』的指標
pcmp_func表明了該陣列元素的型別,它是指向函式的指標,返回值為int,有兩個const char*型別的引數;
實際上語句pcmp_func
(*ppcmps)[2] = &pcmpfuncs;
將會被編譯器解釋為:
int(*(*ppcmps)[2])(const char*, const char*) = &pcmpfuncs;
宣告分解:
(*ppcmps):表明ppcmps是乙個指標;
(*ppcmps)[2]:後面緊跟[2],表明ppcmps是乙個指向『兩個元素陣列』的指標
int (*)(const char*, const char *):表明了該陣列元素的型別,它是指向函式的指標,返回值為int,有兩個const char*型別的引數;
3. 函式指標與類
在c++語言中,使用函式指標可以指向類的乙個成員函式或變數,雖然這種用法很少能用到,至少我是沒有用過,不過了解一下還是有點必要的。
為了支援這類指標,c++有三個特殊的運演算法符:::*,.->,.*;
指向成員函式的指標必須與向其賦值的函式型別匹配,這包括:1)引數的型別和個數;2)返回值型別;3)它所屬的型別;
指向成員變數的指標必須與向其賦值的變數型別匹配,這包括:1)變數型別;2)它所屬的型別;
成員函式和變數必須被繫結到乙個物件或者指標上,然後才能得到呼叫物件的this指標,然後才能指向成員變數或函式;
類aclass的成員變數int m_ivalue,其完整型別是:int型的類aclass的成員m_ivalue;
類aclass的成員函式int add(int),其完整型別是:返回值為int型,帶乙個int型別引數的類aclass的成員add;
注意:指向類的靜態變數或靜態成員函式的指標和普通成員不同;
3.1 指向類成員變數的指標
有了上面的一些說明,看下面的例子就很容易理解了;
.* 是乙個新的操作符,表明是指向成員操作符的指標(另乙個是->*,是指標物件的呼叫方式)
class aclass
int m_ivalue;
};
int _tmain(int argc, _tchar* argv)
3.2 指向類成員函式的指標
有了上面的一些說明,看下面的例子就很容易理解了;
下面的例子中,注意呼叫方式:(a.*paadd)(5);不能寫作a
.*paadd(5);
因為操作符()的優先順序是高於.*的因此,它將被解釋為a.*(paadd(5));顯然這是不被支援的。
class aclass
int m_ivalue;
};
// 指向類aclass成員函式的指標的宣告方式
typedef
void (aclass::*pafunc)(int);
// 宣告乙個指向aclass::add()的函式指標
pafunc paadd = &(aclass::add);
int _tmain(int argc, _tchar* argv)
3.3 指向類靜態成員的指標
類的靜態成員屬於該類的全域性物件和函式,並不需要this指標;因此指向類靜態成員的指標宣告方式和普通指標相同。
該類指標和普通指標的宣告和呼叫方式完全相同;唯一的不同就是設定指向的物件時,仍然需要類資訊,這一點和指向普通成員的指標相同。
下面的例子可以說明使用方式。
class aclass
static
int m_ivalue;
};
int aclass::m_ivalue;
typedef
void(*paadd)(int);
int _tmain(int argc, _tchar* argv)
指標函式,函式指標,指標的指標 詳解
1 指標函式是指帶指標的函式,即本質是乙個函式。函式返回型別是某一型別的指標 型別識別符號 函式名 參數列 int f x y 首先它是乙個函式,只不過這個函式的返回值是乙個位址值。函式返回值必須用同型別的指標變數來接受,也就是說,指標函式一定有函式返回值,而且,在主調函式中,函式返回值必須賦給同型...
函式指標詳解
這篇文章把函式指標的各種常用情況做了乙個詳解的總結。1.指向普通函式的指標 很簡單,如下的例子可以說明基本格式和用法 cpp view plain copy int int add int a,int b int int sub int a,int b int int operator int,in...
函式指標詳解
這篇文章把函式指標的各種常用情況做了乙個詳解的總結。1.指向普通函式的指標 很簡單,如下的例子可以說明基本格式和用法 int int add int a,int b int int sub int a,int b int int operator int,int int add int tmain ...