1. 程式人生 > >簡化void(*signal(int signum, void(*handler)(int)))(int)

簡化void(*signal(int signum, void(*handler)(int)))(int)

1.先看void(*handler)(int),這就是一個函式指標嘛,這步我們可以用typedef來定義函式指標型別 
typedef void(*handler)(int),這步簡化完後為

typedef void(*handler)(int)
void(*signal(int signum, handler h))(int)
2.先把signal(int signum, handler h)扣出來,剩下void(*)(int),又是個函式指標,引數和返回值和上面的一樣 
然後剩下的signal(int signum, handler h)不就是個函式,說明這個函式的返回值是函式指標型別

3.最終簡化為

handler signal(int signum, handler h)

函式名稱:signal 
引數一:int型 
引數二:函式指標型,引數為int,返回值為void 
返回值:函式指標型,引數為int,返回值為void

呼叫例項

#include "stdafx.h"
void Fun(int x)
{
}

void(*signal(int signum, void(*handler)(int)))(int)
{
    return Fun;
}
int _tmain(int argc, _TCHAR* argv[])
{
    void(*pFun)(int) = signal(1, Fun);
};                               

執行完之後pFun 就是Fun的地址了

 

再看另外一個列子

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

此處由於加了typedef自定義了一個新型別sighandler_t,所以第二行的函式原型看起來順眼多了,形式跟int func(char c, int i)無異,但是如果看不懂typedef語句,這兩句話仍然是噩夢。

要理解typedef,只要記住一句話就差不多了,那就是:typedef在語句中所起的作用只不過是把語句原先定義變數的功能變成了定義型別的功能而已。我們只消看幾個例子立即明白。

例如語句 typedef int *apple; 理解它的正確步驟是這樣的:先別看typedef,就剩下int *apple; 這個語句再簡單不過,就是聲明瞭一個指向整型變數的指標apple (注意:定義只是一種特殊的宣告),加上typedef之後就解釋成聲明瞭一種指向整型變數指標的型別apple 。

現在,回過來看上面的這個函式原型 typedef void (*sighandler_t)(int),蓋住 typedef不看 ,再簡單不過,sighandler_t就是一個函式指標,指向的函式接受一個整型引數並返回一個無型別指標 。加上typedef之後sighandler_t就是一種新的型別,就可以像int一樣地去用它,不同的是它宣告是一種函式指標,這種指標指向的函式接受一個整型引數並返回一個無型別指標 。怎麼樣?簡單吧。

再來做一個更酷的練習,請看:typedef char *(* c[10])(int **p);

去 掉typedef就變成char *(* c[10])(int **p),先不管這個語句有多難看,它一定是聲明瞭一個擁有10個元素的陣列c對不對?okay沒什麼了不起的,只不過這個陣列c的元素有點特別,它們都 是函式指標,並且它們所指向的這些函式統統都接受一個二級指標然後返回一直指向字元型的指標。加上typedef之後,c就不是一個數組了,而是一種型別 了