C語言中typedef關鍵字應用比較常見,許多C語言初學者對它的用法不甚了解。事實上,我們可以用typedef來定義自己習慣使用的數據類型名稱,可以替代自己所熟悉的基本類型、數組類型、指針類型以及自己定義的結構體類型、共用體類型、枚舉類型等。一旦我們在程序中定義了自己的數據類型名稱,我們就可以像使用int、float和double等基本數據類型一樣來使用它。實際使用中,typedef有以下幾種主要形式。
1、 給基本數據類型定義新名字
基本數據類型的新名字定義通常有兩個方面的作用:
1) 使數據類型名稱簡潔
新類型名字定義代碼如下所示:
typedef unsigned int UINT;
新類型名UINT定義之後就可以使用它來定義變量,定義代碼如下:
UINT a,b,c;
2) 代碼中的類型與平臺無關
由於C語言代碼有較強的移植性,通過代碼移植,可以使其運行在不同的硬體平臺上,使用typedef就可以定義與平臺無關的類型。假如用戶的程序代碼用到了浮點類型,不同平臺支持的最高精度不同,這樣用戶在編程時可以用typedef直接定義一個名為REAL的浮點類型,代碼在不同平臺運行時僅需修改REAL的定義即可。
如某個平臺最高支持long double,那麼可以將REAL定義如下:
typedef long double REAL;
如果另一個平臺最高僅支持float,那麼可以將上述定義修改成如下形式:
typedef float REAL;
2、 給數組類型定義新名字
與給基本數據類型定義新名字類似,給數組類型可以定義新名字,定義形式如下:
typedef int ARR_T[50];
這裡ARR_T就是一個整型數組類型名,當用戶需要定義包含50個元素的整型數組時,可以這樣定義:
ARR_T myIntArr;
這裡myIntArr就是一個包含了50個元素的數組名。
3、 給指針類型定義新名字
對於普通的指針類型,定義類似於上述兩種情況,定義代碼如下:
typedef int * PINT;
PINT pin1, pin2;
這裡PINT是一個指向整型變量的指針類型,利用它定義了兩個指向整型變量的指針pin1和pin2。
對於複雜一點的指針類型,就更能體現出typedef的優勢。請看下面的聲明代碼示例:
int * (*s[10])(int *, char *(*)());
對於這個複雜的聲明,可以通過typedef定義一個新的簡單的別名。過程如下:在原來的聲明裡逐步用別名替換一部分複雜聲明,如此循環,把帶變量名(這裡為s)的部分留到最後替換,最終得到的就是上述聲明的最簡化版,具體定義如下:
typedef char *(*pParam)();
typedef int *(*PFUN)(int *, pParam);
PFUN s[10];
4、 給自定義數據類型定義新名字
假如用戶程序用到了許多自定義數據類型,如結構體類型、共用體類型、枚舉類型等。為了使自定義數據類型簡潔,可以在其定義的同時時使用typedef給其重新定義一個較為簡潔、直觀的名字。以結構體為例,定義代碼形式如下:
typedef struct tagNODE
{
int data;
struct tagNODE *next;
}NODE, *PNODE;
這裡在定義結構體數據類型時,利用typedef定義了兩個類型,NODE和PNODE分別為普通變量類型和指向結構的指針類型。
注意,結構體內部一定要用原結構體類型名(struct tagNODE)定義指針next,千萬不可以用PNODE或NODE*定義,這是因為此時結構體類型還沒有定義完成,不可以使用PNODE和NODE。
定義完之後,就可以使用新類型名定義變量了,簡化了定義,使用形式如下:
NODE nd1, nd2, nd3;
PNODE pnd;
nd1, nd2, nd3為普通結構體變量,pnd為指向結構體變量的指針。
關於typedef典型用法今天就總結到這,如果大家有任何疑問請留言探討。我是「C語言知識傳播者」,我會用心總結C語言知識的點點滴滴,你的關注是我持續創作的動力,請關注我,收藏本文、轉發並點讚,希望得到你們的持續關注,謝謝!