程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> void (*f(int, void (*)(int)))(int) 函數解析 轉,voidint

void (*f(int, void (*)(int)))(int) 函數解析 轉,voidint

編輯:關於C語言

void (*f(int, void (*)(int)))(int) 函數解析 轉,voidint


今天與幾個同學看到了一個函數指針定義:

 

void (*f(int, void (*)(int)))(int)

 

以前在C trap pit fails裡面見過,但是文章裡面介紹的很詳細,但是往往使初學者抓不到重點, 結果弄的一頭污水。這裡就簡單介紹一下這中函數指針的定義方法。

 

什麼是函數指針?

 

這個問題從定義的角度來看很好理解,指向函數的指針就是函數指針,但是我們如何聲明一個函數指針呢?又如何將一個地址強制轉換為某一個類型的函數指針呢?這裡看下面一個例子源碼:

void function(int a)

{

       a = 5;

}

void (*pfunc)(int);

 

很簡單,上面這段代碼聲明了一個函數fucntion和一個函數指針pfunc, 它指向的函數就是一個具有void返回值,int參數的函數。如果將function函數的地址給pfunc指針,可以簡單的通過下面兩種賦值:

       pfunc = function;

或者

       pfunc = &function;

通過指針調用該函數,也有兩種方法:

       pfunc(5); 或 (*pfunc)(5);

我們看一下賦值語句,pfunc = function; 但有時候可能是一個常數0x8999940, 它恰好也表示一個安全的與function相同的函數,如何將這個數值賦給pfunc呢?顯然我們需要強制類型轉換,應該將該常數轉換成什麼類型呢?這就是問題的關鍵!

       在void (*pfunc)(int)語句裡面,只有pfunc是變量名稱,那麼剩余的部分,void(*)(int),就是我們需要的轉換類型。因此,新的賦值語句是:

                     pfunc = (void (*)(int)) 0x8999940;

       賦值完成後,就可以通過pfunc(5); 或 (*pfunc)(5);調用相應的函數了。

 

       如果理解了上面的內容,我們就可以解釋void (*signal(int, void (*)(int)))(int)這個相對復雜的問題了

 

返回函數指針的函數聲名

 

現在我們先拋開上面那個復雜的定義,先看一下下面的需求1) 定義一個函數;2) 該函數具有以下特點,兩個參數,返回值是函數指針,並且一個參數也是函數指針。假如返回值和參數函數指針同為void (*)(int); 另一個函數參數是int型。該函數定義名稱為my_func。

 

根據需求我們可以很容易定義出這種函數:

 

typedef void (*HANDLER)(int); // 參數函數和返回函數定義

HANDLER my_func(int, HANDLER);

 

突然需求中又不讓使用typedef,這就是早期C語言不支持typedef的情況,那麼如何定義這種函數呢?

我們假如說my_func的返回值是int,是不是它的定義可以這麼寫:

int my_func(int, void (*)(int));

       也就是說,my_func(int, void (*)(int))就是一個int型數據。現在將int換成一個函數,也就是

              void (*)(int) my_func)(int, void (*)(int);

       這樣一種定義,顯然這種語法不支持,那麼,實際是如何表示呢?回過頭來,我們先看看函數指針的聲明格式

       void (*pfunc)(int)

       其中pfunc 等價於 void (*)(int)。現在在看看上面的格式,是不是很相識,對了,pfunc就是my_func(int, void (*)(int))。現在如果將兩者代替一下是不是就成了這種格式:

              void (*my_func(int, void(*)(int)))(int)

如果將my_func換成signal,是不是就是我們文章開始提到的那個復雜聲名?現在是不是明白了,原來如此啊,它是一個返回函數指針的的函數聲名!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved