C語言的typedef詳解

                         

初學的時候,我們經常聽說:typedef就是define。
看看下面的程序:
define INTEGER int

typedef int INTEGER;
乍一看,也對,除了順序上的差別
再來看看下面的程序
typedef int INT20[20];
這個用define解釋就有些牽強了,不過還是可以一定程度上解釋的,比如:
INT20 a;
那麼,a就是一個大小爲20的整型數組,類似於int a[20];
於是,我們就可以認爲:typedef就是define了
直到你遇到如下的程序爲止:
typedef int (* pFun)();
define理論立刻崩潰了。下面我講一下理解typedef的正確方法,分爲以下幾步:
1.確定被聲明的類型:遇到typedef時,從左到右進行掃描,找到第一個“陌生”的標誌符,這個標誌符就應該是語句所聲明的類型名稱。eg:
typedef int* (* pt)(int* (*pn)(int * p1,int *p2),int * p3);
如果pt是生詞(既不是保留字,也不是生命過的類型),那麼它就是要聲明的類型。其它的名字都是爲了閱讀方便的佔位符,可有可無。也就是說,上面的語句等價爲:
typedef int * (*pt)(int * (*)(int *, int *),int *);
2,之後一旦遇到該類型聲明的變量,則在該類型的typedef式中用變量代替類型,去掉typedef關鍵字,所得到的聲明式等價與原來的聲明。eg:
pt p;
這個聲明式,可以經過兩步變化爲等價的聲明式。
首先,回到pt的typedef式:
typedef int * (*pt)(int * (*)(int *, int *),int *);
用p代替pt:
typedef int * (*p)(int * (*)(int *, int *),int *);
然後把typedef去掉,得到:
int * (*p)(int * (*)(int *, int *),int *);
這個語句與 pt p;
意義相同。

如果你基礎紮實,應該知道,這是個函數指針的聲明,所指向的函數有兩個int * 參數,第一個參數的 (*)(int *,int *)的這個部分又是一個指向函數的指針,這個函數返回一個指向函數指針,經過(*)處理後,變成一個變量,再經過int *處理後,又變成一個指向整形變量的指針 int *。第二個參數是int * ,整個函數返回一個int *。
 
個人認識:在對待typedef定義的類型時要把整個定義看做一個整體 如上面的例子
typedef int INT20[20]; 即定義了一個有二十個元素的整型數組的別名,以後就可以用 INT20 來定義有二十個元素的整型數組變量了
幾個經典的實例,以供參考
>1:int *(*a[5])(int, char*);
//pFun是我們建的一個類型別名
typedef int *(*pFun)(int, char*);
//使用定義的新類型來聲明對象,等價於int* (*a[5])(int, char*);
pFun a[5];

>2:void (*b[10]) (void (*)());
//首先爲上面表達式藍色部分聲明一個新類型
typedef void (*pFunParam)();
//整體聲明一個新類型
typedef void (*pFun)(pFunParam);
//使用定義的新類型來聲明對象,等價於void (*b[10]) (void (*)());
pFun b[10];

>3. doube(*)() (*pa)[9];
//首先爲上面表達式藍色部分聲明一個新類型
typedef double(*pFun)();
//整體聲明一個新類型
typedef pFun (*pFunParam)[9];
//使用定義的新類型來聲明對象,等價於doube(*)() (*pa)[9];
pFunParam pa;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章