C 函式指標

2021-09-11 19:44:01 字數 4486 閱讀 2656

函式指標指向的是函式並不是物件。和其他指標一樣,函式指標指向某種特定型別,函式的型別由它的返回型別和形參型別共同決定,與函式名無關。

宣告指向函式的指標的語法形式:用指標替代函式名

//比較兩個string物件的長度

bool lengthcompare

(const string &

,const string &);

//pf就是指向函式的指標,該函式的形參為const string的引用,返回值為bool型別

bool (

*pf)

(const string &

,const string &);

//pf前面有個*,表示為指標;右側是形參列表,則表示pf指向的是函式;再觀察左側,函式返回型別是bool值

//*p兩端的括號不能省略

bool *pf(

const string &

,const string &);

//宣告名為pf的函式,函式返回型別為bool*

把函式名當乙個值使用時,該函式自動轉換為指標

//pf為指標,函式名當值使用,函式自動轉換為位址,取位址符可要可不要

pf=lengthcompare;

//pf指向lengthcompare函式

pf=&lengthcompare;

//與上式等價,取位址符可要可不要

可以直接使用指向該函式的指標,無須提前解引用指標

bool b1=pf(

"hello"

,"goodbye");

//呼叫lengthcompare函式

bool b2=

(*pf)

("hello"

,"goodbye");

//等價呼叫

bool b3=

lengthcompare

("hello"

,"goodbye");

//等價呼叫

可以為函式指標賦予nullptr,表示該指標沒有指向任何乙個函式。

使用過載函式的指標,形參列表函式返回型別都必須要與過載函式中的某乙個精準匹配。

voidff(

int*);

voidff(

unsigned

int)

;void

(*pf1)ff(

unsigned

int)

;//pf1指向ff(unsigned int)

void

(*pf2)ff(

int)

=ff;

//錯誤:沒有任何乙個ff與pf2的形參列表匹配

double

(*pf3)ff(

int*

)==ff;

//錯誤:ff和pf3的返回型別不同

和陣列類似,雖然不能定義函式型別的形參,但是形參可以是指向函式的指標。這時的形參看起來是函式型別,實際上是被當指標使用

//第三個形形參看起來是函式型別,但是它會自動轉換為指向函式的指標

void

usebigger

(const string &s1,

const string &s2,bool pf

(const string &

,const string &))

;//等價的宣告:顯式地將形參定義為指向函式的指標

void

usebigger

(const string &s1,

const string &s2,bool (

*pf)

(const string &

,const string &))

;//把函式作為實參使用,它也會轉換為指標

usebigger

(s1,s2,lengthcompare)

;

使用型別別名和decltype簡化函式指標的**:

//func函式型別的別名

typedef bool func

(const string &

,const string &);

//funcp函式指標型別的別名

typedef book (

*funcp)

(const string &

,const string &

);

decltype得到的是函式型別,只有在前面加上*才能得到指標。

//func自動地轉換為函式指標

void

usebigger

(const string &

,const string &

,func)

;void

usebigger

(const string &

,const string &

,funcp)

;

編譯器自動地將func表示的函式型別轉換為指標。

使用型別別名可以定義函式型別,也可以定義指向函式型別的指標。

using f=

int(

int*

,int);

//f是函式型別,不是指標

using pf=

int(*)

(int*,

int);;

//pf是函式指標型別

pf f1

(int);

//正確:pf是指向函式的指標,f1返回的是函式的指標

f f1

(int);

//錯誤:f是函式型別,f1不能返回函式型別

f *f1

(int);

//正確:顯式地將返回型別轉換為函式的指標

int(*f1

(int))

(int*,

int)

;//f1有形參列表,所以f1是個函式;f1前面有*,所以f1返回的是乙個指標;指標的型別本身也包含形參列表,因此指標指向函式,該函式的返回型別為int

//尾置返回型別

autof1(

int)

->

int(*)

(int*,

int)

;

使用auto和decltype用於函式指標型別:decltype得到的型別,需要加上*得到函式指標,auto直接得到函式指標。

//加法

intfunc2

(int a,

int b)

//減法

intfunc3

(int a,

int b)

//乘法

intfunc4

(int a,

int b)

//除法

}int

main

(void);

system

("pause");

}

#include

#include

using namespace std;

intfunc1

(int a,

int b)

//加法

intfunc2

(int a,

int b)

//減法

intfunc3

(int a,

int b)

//乘法

intfunc4

(int a,

int b)

//除法

}//第三個形參為函式指標

void

compute

(int a,

int b,

int(

*p)(

int,

int)

)int

main

(void);

for(

auto it : vf)

system

("pause");

}

C 指標函式和函式指標

1 指標函式 1 基本概念 指標函式 顧名思義就是帶有指標的函式,即其本質是乙個函式,只不過這種函式返回的是乙個對應型別的位址。2 定義式 type func type type 如 int max int x,int y 3 例子詳解 cpp view plain copy 1.include 2...

c 指標函式和函式指標

函式指標與指標函式 1 函式指標 形式 返回型別 函式名 參數列 一種特殊的指標,它指向函式的入口 定義乙個函式指標p,只能指向返回值為int,形參為兩個int的函式 輸出結果 include stdafx.h include using namespace std int p int,int in...

C 函式指標與指標函式

函式指標 函式名本身代表著函式的位址,因此給函數指標賦值使可以不用加 符號 加也可以!void func int 定義乙個函式 void pf int 定義乙個函式指標 pf func 給函式指標賦值 int f x,y 其中x,y是形式引數,f是函式名,呼叫後返回乙個指向整型資料的位址指標。f x...