函式指標指向的是函式而非物件。
函式指標指向某種特定的型別,函式的型別由它的返回型別和形參型別共同決定,與函式名無關。如
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的位,他們可以被解釋為整數或者其他,這取決...