c 函式指標

2022-06-20 10:45:08 字數 2376 閱讀 4369

*****************************

在有些程式語言中,函式是「第一級值」。在這些語言中,可以將函式作為函式引數

傳遞,並把它們當作表示式的元件使用等。

c++不屬於這類語言,但這一點並不是顯而易見的。因為對於c++程式而言,將函式作為

引數傳遞,並把它們的位址儲存在資料結構中是很常見的操作。

例如,假設我們想對某個陣列的所有元素都運用某個給定函式。如果這個函式有乙個int

引數,並且生成void型別,我們可以如下編寫**

*****************************

for (int i = 0;i < n;i++)

}*****************************

這是不是說明c++把函式也當作第一級值呢?

本例中第乙個隱蔽之處就是,f雖然看上去像函式,其實根本就不是函式。相反它是乙個

函式指標。和在c中一樣c++不可能有函式型別的變數,所以任何宣告這種變數的企圖都將

立即被轉換成指向函式的指標宣告。和在c中一樣,所有對函式指標的呼叫都等價於這個

指標所指向的函式的呼叫。所以前面的例子就等價於

*****************************

for (int i = 0;i < n;i++)

}*****************************

那又怎麼樣?函式和函式指標之間的有什麼重大差異嗎?這個差異和任何和任何指標與

其所指向的物件之間的差異是類似的:不可能通過操縱指標建立這樣的物件。c++函式的總

儲存空間在程式執行之前就固定了。一旦程式開始執行,就無法建立新函式了。為了理解

為什麼說不能動態建立新函式是個問題,我們來思考一下如何寫乙個c++函式,以便把兩個

函式組合起來生成第三個函式。組合是我們所能想到的建立新函式最簡單的方法之一。現在

為了簡單期間,我們將假設每個函式都有乙個整數引數並返回乙個整數結果。然後,假設我

們有一對函式f和g:

extern int f(int);

extern int g(int);

我們希望能夠使用下面的語句:

int (*h)(int) = compose(f,g);

具有一種特徵,就是對於任何整數n而言,h(n)將等價於f(g(n))。

c++沒有提供直接做這件事的方法。我們可以杜撰如下的**:

int (*compose(int f(int), int g(int) ) )(int x)

return result;

}這裡,compose試圖用兩個函式f和g來定義乙個函式,當應用於x時可以得到f(g(x))的函式;

但是由於兩個原因它不可能成功。第乙個原因就是c++不支援巢狀函式,這意味著result的定義

非法。而且由於result需要在塊作用域之內訪問f和g,所以沒有簡便的方法可以繞過這個限制。

簡單的使result全域性化:

int result(int n)

int (*compose(int f(int), int g(int))) (int x)

{return result;

}這個例子的問題在於f和g在result中沒有定義。

第二個問題更難以捉摸。假設c++允許巢狀函式——畢竟c++實現把它當成一種擴充套件,那麼這樣

做會成功嗎?

可惜的是,答案是「實際不會成功」。為了了解原因,我們稍微修改了一下compose函式:

*****************************

int (*compose (int f(int), int g(int)))(int x)

return result;

}*****************************

其中所做的改變是將f和g的位址複製到兩個區域性變數fp和gp中去。現在,假設我們呼叫compose,

它將返回乙個指向result的指標。因為fp和gp是compose的區域性變數,所以一旦compose返回它們

就消失了。如果我們現在呼叫result,它將試圖使用這些區域性變數,但是這些變數已經被刪除了。

結果很可能導致程式執行崩潰

顯然編寫compose的最後乙個版本,我們應該很容易明白這個程式失敗的原因。然而,第乙個版本

也存在相同的問題。唯一的不同的是第乙個版本中的f和g不是普通的區域性變數,而是形參。這個

區別無關大局:當compose返回時它們也消失;也就是說當result試圖訪問它們時也會導致崩潰。

那麼顯然編寫compose函式除了需要常規的基於堆疊的實現外,還需要某種自動**機制。儘管

c++將垃圾**集作為語言的標準部分會給很多方面帶來好處,但是存在太多的困難使我們不能這

樣定義c++。

write by fgd

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