如何解讀返回函式指標的函式宣告

2021-09-07 08:34:59 字數 1197 閱讀 2316

int (*(*pf())())()

從來沒有見過這樣的函式宣告。那麼它究竟是乙個怎樣的函式呢?我努力回憶起《c專家程式設計》一書的內容,把其中解讀變數宣告的方法應用於該函式上,最終讀懂了該函式。下面是大致的解讀過程。

首先,要確定宣告**現的操作符的優先順序。顯然,函式呼叫操作符()的優先順序是高於指標解引用操作符*的。另外,小括號總是具有最高優先順序。

其次,要確定在宣告中識別符號與某個操作符結合起來的時候有什麼意義。例如:

a()    a是乙個函式

*a     a是乙個指標

由於函式宣告的特殊性,當指標解引用操作符*與乙個表示函式的識別符號結合時,表示這個函式的返回值是乙個指標。例如 *a() 表示a是乙個返回值為指標的函式。

有了以上的基礎,接下來我們就可以從宣告中的識別符號開始,按照操作符的優先順序,由內向外逐步來解讀:

pf()            pf是乙個無引數函式

*pf() pf是乙個無引數函式,它的返回值是乙個指標

( *pf() ) () pf是乙個無引數函式,它的返回值是乙個無引數函式的指標

* ( *pf() ) () pf是乙個無引數函式,它的返回值是乙個無引數函式的指標,這個函式的返回值又是乙個指標

( * ( *pf() ) () ) () pf是乙個無引數函式,它的返回值是乙個無引數函式的指標,這個函式的返回值又是乙個無引數函式的指標

int ( * ( * pf() ) () ) () pf是乙個無引數函式,它的返回值是乙個無引數函式的指標,這個函式的返回值又是乙個無引數且返回值為int的函式的指標。

最終的解讀結果冗長拗口。可以看出,這實際上是返回值為函式指標的函式的遞迴宣告。下面是可讀性更強的等效**:

typedef int (*pa)(); 

typedef pa (*pb)();

pb pfex()

下面是驗證解讀結果的測試**。不得不說,測試**也不容易理解……

#include int

a()

int (*b())()

int (*(*pf())())()

typedef

int (*pa)();

typedef pa (*pb)();

pb pfex()

intwmain()

返回函式指標的函式

顧名思義,指標函式即返回指標的函式。其一般定義形式如下 型別名 函式名 函式引數表列 其中,字尾運算子括號 表示這是乙個函式,其字首運算子星號 表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個 指向返回值為 的指標 位址 型別名 表示函式返回的指標指向...

指標與函式 返回函式指標

返回函式指標,其實就是返回乙個函式。返回值為乙個函式名就可以了。includeint add int num1,int num2 int subtract int num1,int num2 typedef int fptroperation int,int fptroperation select...

定義返回函式指標的函式

博學,切問,近思 詹子知 1.基礎知識 1 定義函式指標 return type func pointer parameter list 2 定義返回函式指標的函式 return type function func parameter list parameter list 定義了乙個函式func...