指向函式的指標 1

2021-07-29 12:41:18 字數 3234 閱讀 2121

先來看乙個函式:

[cpp]view plain

copy

intsum(

inta, 

intb)    

這個函式,呼叫方式可以如

sum(1, 2);

若要表示函式的指標,可以用&sum,也可以將sum前邊的位址操作符&去掉,對於普通函式,位址操作符&是可選的

下面介紹函式指標變數和函式指標型別: 

1.  函式指標變數

[cpp]view plain

copy

int(*fnname)(

int, 

int);           

// 宣告乙個函式指標,可以將fnname理解為新定義的變數

fnname = ∑             // 將sum函式的位址賦給它

(*fnname)(3, 5);           // 和呼叫sum(3, 5)的效果是一樣的

第1行宣告了乙個函式指標變數,如果有疑問,可以將fnname

理解為乙個新定義的變數。函式指標變數的宣告格式:

返回型別(*

函式指標變數)(引數列表)

;第2行將sum函式指標賦給它,注意,只有兩個函式指標引數型別,返回值型別完全相同才可以賦值,注意修飾符const,&等不同也會導致賦值失敗。

第3行是呼叫,呼叫格式:(*

函式指標變數)(實參列表);

2.  函式指標型別

前面介紹了函式指標變數的宣告,那麼函式指標型別如何宣告呢?

在函式指標宣告前面加個typedef就成了函式指標型別定義。

[cpp]view plain

copy

typedef

int(*fntype)(

int, 

int);   

// 宣告乙個函式指標型別

fntype fb = ∑                   // 定義乙個fntype型別的變數,並賦值

(*fb)(3, 5);                        // 函式呼叫

第1行宣告函式指標的型別,fntype

便是新宣告的型別,它是函式指標的型別。

第2行定義乙個fntype型別的變數,並將sum函式位址賦值給它。

第3行是函式呼叫。 

前面已經了解了函式指標的變數和型別,看下面的**加深下理解:

[cpp]view plain

copy

intsum(

inta, 

intb)  

typedef

int(*fntype)(

int, 

int);  

intfun1(fntype ft, 

intx, 

inty)  

// 函式指標可以定義在引數列表中,在函式體內使用

intfun2(

int(*fn)(

int, 

int), 

intx, 

inty)  

intmain()    

關於普通函式指標的學習就到這裡吧,簡單吧:),下面就來學習類的成員函式的指標。 

先看下面這個類:

[cpp]view plain

copy

class

num  

void

inc(

intn);  

void

dec(

intn);  

static

intsub(

inta, 

intb);  

private

:  long

n_;  

};  

這個類中有普通成員函式,也有靜態成員函式,無論哪種函式,函式指標表示方式都是:

&類名::函式名

如num類三個成員函式的指標分別是:

&num::inc;

&num::dec;

&num::

sub;

1.  指向普通成員函式的指標

宣告乙個指向類成員函式的指標時需要用到::*符號,左邊是類名,右邊是成員函式指標名:

返回型別 類名::*成員函式指標(引數列表);

呼叫的時候要用到.*或->*,左邊是類物件的引用或指標,右邊是成員函式指標:

(物件名.* 成員函式指標)(實參); 或

(物件指標->* 成員函式指標)(實參);

**示例:

[cpp]view plain

copy

intmain()    

注意上面,sub

是靜態成員函式,其指標宣告跟非靜態成員函式不一樣,下面來看靜態成員函式的指標。 

2. 指向靜態函式的指標

[cpp]view plain

copy

int(*smf)(

inta, 

intb); 

// 注意寫法

smf = &num::sub;  

cout << (*smf)(6, 7);        // 呼叫方式跟上一節講的普通函式呼叫方式一樣

可以看到,靜態成員函式指標變數、型別宣告與普通函式一致。 

3.指向虛函式的指標

先上**:

[cpp]view plain

copy

class

base  

typedef

void

(base::*fnptr)() 

const

;  };  

class

derived : 

public

base  

};  

intmain()    

輸出結果:

i am thebase

i am thederived

可見,虛函式的指標呼叫結果跟直接呼叫虛函式效果一樣,虛函式的指標指向的函式位址是物件動態繫結的函式位址。

指向函式的指標 函式指標

如果在程式中定義了乙個函式,在編譯時,編譯系統為函式 分配一段儲存空間,這段儲存空間的起始 又稱入口 位址 稱為這個函式的指標。指標即是位址 我們定義乙個指標變數,這個指標變數指向乙個整型資料變數的位址,我們稱指向乙個整型資料的指標變數 那麼它指向乙個函式的位址,稱為指向乙個函式的指標變數。形如 i...

函式指標 指向函式的指標

乙個函式總是占用一段連續的記憶體區域,函式名在表示式中有時也會被轉換為該函式所在記憶體區域的首位址,這和陣列名非常類似。我們可以把函式的這個首位址 或稱入口位址 賦予乙個指標變數,使指標變數指向函式所在的記憶體區域,然後通過指標變數就可以找到並呼叫該函式。這種指標就是函式指標。函式指標的定義形式為 ...

指向函式的指標,指向函式的指標作為函式引數

1.基本法 include pragma warning disable 4996 pragma warning disable 4715 指向函式的指標作為函式的引數 有兩個整數a,b,讓使用者輸入1,2或者3,當輸入1時,給出相對大值,當輸入2時,給出相對小值,當輸入3時,給出兩者之和 1.可以...