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)不就是個函數,說明這個函數的返回值是函數指針類型app
3.最終簡化爲函數
handler signal(int signum, handler h)spa
函數名稱: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);
}; gc
執行完以後pFun 就是Fun的地址了apple
再看另一個列子handler
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就不是一個數組了,而是一種類型 了