函式指標詳解

2021-08-20 13:24:25 字數 3576 閱讀 7818

這篇文章把函式指標的各種常用情況做了乙個詳解的總結。

1. 指向普通函式的指標

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

[cpp]view plain

copy

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. 指向『函式指標陣列』的指標

還可以宣告乙個指向『函式指標陣列』的指標,比如下面的例子**:

[cpp]view plain

copy

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 指向類成員變數的指標

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

.* 是乙個新的操作符,表明是指向成員操作符的指標(另乙個是->*,是指標物件的呼叫方式)

[cpp]view plain

copy

class aclass  

int  m_ivalue;  

};  

int _tmain(

int argc, _tchar* argv)     

3.2 指向類成員函式的指標

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

下面的例子中,注意呼叫方式:(a.*paadd)(5);不能寫作a.*paadd(5);

因為操作符()的優先順序是高於.*的因此,它將被解釋為a.*(paadd(5));顯然這是不被支援的。

[cpp]view plain

copy

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指標;因此指向類靜態成員的指標宣告方式和普通指標相同。

該類指標和普通指標的宣告和呼叫方式完全相同;唯一的不同就是設定指向的物件時,仍然需要類資訊,這一點和指向普通成員的指標相同。

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

[cpp]view plain

copy

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.指向普通函式的指標 很簡單,如下的例子可以說明基本格式和用法 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 上例中,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 ...