第六章 函式 6 7 函式指標

2021-10-19 21:27:23 字數 3740 閱讀 8518

函式指標指向的是函式而非物件。

函式指標指向某種特定的型別,函式的型別由它的返回型別和形參型別共同決定,與函式名無關。如

bool

lengthcompare

(const string&

,const string&

);

該函式的型別是

bool(const string&, const string&)

宣告乙個指向該函式的指標

bool

(*pf)

(const string&

,const string&);

// pf 指向乙個函式,該函式的引數是兩個 const string 的引用,返回值是 bool 型別

使用函式指標

當我們把函式名作為乙個值使用時,該函式自動地轉換成指標。

pf = lengthcompare;

// pf 指向名為 lengthcompare 的函式

pf =

&lengthcompare;

// 等價的賦值語句,取位址符是可選的

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

bool b1 =pf(

"hello"

,"goodbye");

// 呼叫 lengthcompare 函式

bool b2 =

(*pf)

("hello"

,"goodbye");

// 乙個等價的呼叫

bool b3 =

lengthcompare

("hello"

,"goodbye");

// 另乙個等價的呼叫

在指向不同函式型別的指標間不存在轉換規則。

可以為函式指標賦乙個 nullptr 或者值為 0 的整形常量表示式,表示該指標沒有指向任何乙個函式

string::size_type sumlength

(const string&

,const string&);

bool

cstringcompare

(const

char*,

const

char*)

;pf =0;

pf = sumlength;

// 錯誤:返回型別不匹配

pf = cstringcompare;

// 錯誤:形參型別不匹配

pf = lengthcompare;

// 正確:函式和指標的型別精確匹配

過載函式的指標

如果定義了指向過載函式的指標,編譯器通過指標型別決定選用哪個函式,指標型別必須與過載函式中的某乙個精確匹配。

函式指標形參

不能定義函式型別的形參,但是形參可以是指向函式的指標。此時,形參看起來是函式型別,實際上卻是當成指標來用

// 第三個形參是函式型別,它會自動地轉換成指向函式的指標

void

usebigger

(const string &s1,

const string &s2,

boolpf(

const string&

,const string&))

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

void

usebigger

(const string &s1,

const string &s2,

bool

(*pf)

(const string&

,const string&))

;

可以直接把函式作為實參使用,此時它會自動地轉換成指標

// 自動將函式 lengthcompare 轉換成指向該函式的指標

usebigger

(s1, s2, lengthcompare)

;

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

// func 和 func2 是函式型別

typedef

bool

func

(const string&

,const string&);

typedef

decltype

(lengthcompare) func2;

// 等價的型別

// funcf 和 funcf2 是指向函式的指標

typedef

bool

(*funcf)

(const string&

,const string&);

typedef

decltype

(lengthcompare)

*funcf2;

// 重新宣告 usebigger

void

usebigger

(const string&

,const string&

, funcf)

;void

usebigger

(const string&

,const string&

, funcf2)

;

返回指向函式的指標

不能返回乙個函式,但可以返回指向函式型別的指標。此時必須把返回型別寫成指標形式,編譯器不會自動地將函式返回型別當成對應的指標型別處理。

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);

// 正確:顯式的指定返回型別

autof1(

int)

->

int(*)

(int*,

int)

;

將 auto 和 decltype 用於函式指標型別

如果明確知道返回的函式是哪乙個,可以使用decltype簡化書寫函式指標返回型別的過程.

string::size_type sumlength

(const string&

,const string&);

string::size_type largelength

(const string&

,const string&);

// 根據其形參的取值,getfcn 函式返回指向 sumlength 或者 largelength 的指標

decltype

(sumlength)

*getfcn

(const string&

);

第六章函式

第六章 函式 重要知識點 1 函式定義的語法形式 資料型別 函式名 形式參數列 關於函式的定義有如下說明。函式的資料型別是函式的返回值型別 若資料型別為void,則無返回值 函式名是識別符號,乙個程式中除了主函式名必須為main外,其餘函式的名字按照識別符號的取名規則可以任意選取。形式引數 簡稱形參...

第六章 函式

示例 使用函式列印菱形 include intprint star int main intprint star int i,j for i 0 i 4 i 定義無參函式 函式名後面的括號中是空的,沒有任何引數,定義無參函式的一般形式為 型別名 函式名 或 型別名 函式名 void 函式體包括宣告部...

第六章 指標

1.多位元組資料的位址是在最左邊還是最右邊的位置,不同的機器有不同的規定,這也正是大端和小端的區別,位址也要遵從邊界對齊 2.高階語言的乙個特性就是通過名字而不是位址來訪問記憶體的位置,但是硬體仍然通過位址訪問記憶體位置 3.記憶體中的變數都是義序列的0或1的位,他們可以被解釋為整數或者其他,這取決...