C 函式指標

2021-08-28 19:08:24 字數 1437 閱讀 5791

與資料一樣,函式也有位址,函式的位址就是記憶體中存放函式語言**的起始位址。函式指標就是指向這個位址。函式指標所指向的型別,就是函式本身。我們知道,指標所指向型別代表了指標所指向的記憶體區域的大小。所以函式指標所指向的型別,就是函式在記憶體中所佔據記憶體的大小。知道了函式的起始位址和大小,所以函式指標可以很輕易的代替函式完成函式呼叫。使用函式指標的好處就是在處理「在執行時根據資料的具體狀態來選擇相應的處理方式」這種需求時更加靈活。

從語法上講,有兩種不相容的函式指標形式:

指向c語言函式和c++靜態成員函式的函式指標

指向c++非靜態成員函式的函式指標

不相容的原因是因為在使用c++非靜態成員函式的函式指標時,需要乙個指向類的例項的this指標,而前一類不需要。

以下給出三個函式指標定義的形式,第乙個是c語言的函式指標,第二個和第三個是c++的函式指標的定義形式(都是指向非靜態函式成員的函式指標):

int (*pfunction)(float,char,char)=null;

int (myclass::*pmemberfunction)(float,char,char)=null;

int (myclass::*pconstmemberfunction)(float,char,char)const=null;

給函式指標賦值,就是為函式指標指定乙個函式名稱。這個過程很簡單,下面是兩個例子:

int func1(float f,int a,int b)

int func2(float f,int a,int b)

然後我們給函式指標 pfunction 賦值:

pfunction=func1;

pfunction=&func2;

上面這段**說明了兩個問題:

(1)乙個函式指標可以多次賦值(想想c++中的引用)

(2)取位址符號是可選的,卻是推薦使用的。

我們可以思考一下為什麼取位址符號是可選的,在普通的指標變數賦值時,如上面所示,需要加取位址符號,而這裡卻是可選的?這是由於要同時考慮到兩個因素(1)避免二義性(2)形式一致性。在普通指標賦值,需要加取位址符號是為了區別於將位址還是將內容賦給指標。而在函式賦值時沒有這種考慮,因為這裡的語義是清晰的,加上&符號是為了和普通指標變數一致—「因為一致的時候就不容易出錯」。

最後我們來使用這個函式:

pfunction(10.0,』a』,』b』);

(*pfunction)(10.0,』a』,』b』);

上面這兩種使用函式指標呼叫函式的方式都是可以的,原因和上面一樣。

下面來說明c++中的函式指標賦值和呼叫,這裡說明非靜態函式成員的情況,c++中規則要求的嚴格的多了。讓我感覺c++就像函式指標的後爸一樣,對函式指標要求特別死,或許是因為他有乙個函式物件這個親兒子。

reference:

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...