在C語言中有一個typedef關鍵字,其用來定義用戶自定義類型。固然,並非真的創造了一種數據類型,而是給已有的或者符合型的以及複雜的數據類型取一個咱們本身更容易理解的別名。總之,可使用typedef關鍵字定義一個咱們本身的類型名稱。它自己是一種存儲類的關鍵字,與auto、extern、mutable、staTIc、register等關鍵字不能出如今同一個表達式中。html
那麼,究竟如何定義,又有哪些狀況下可已使用呢?接下來咱們就對它的幾種用法進行說明:編程
例如:typedef unsigned char uchar數組
描述:uchar等價於unsigned char類型定義 uchar c聲明等於unsigned char c聲明函數
例如: typedef int array[2];學習
描述: array等價於 int [2]定義; array a聲明等價於int a[2]聲明spa
擴展: typedef int array[M][N];指針
描述: array等價於 int [M][N]定義; array a聲明等價於int a[M][N]聲明視頻
例如: typedef int *pointer;htm
描述: pointer等價於 int *定義;pointer p聲明等價於int *a聲明blog
例如: typedef int *pointer[M];
描述: pointer等價於 int *[M]定義 pointer p聲明等價於int *a[M]聲明
描述:C把函數名字當作函數的首地址來對待,咱們可使用最簡單的方法獲得函數地址
例如: 函數:int func(void); unsigned long funcAddr=(unsigned long)func, funcAddr的值是func函數的首地址
例如: typedef int func(void); func等價於 int (void)類型函數
描述1: func f聲明等價於 int f(void)聲明,用於文件的函數聲明
描述2: func *pf聲明等價於 int (*pf)(void)聲明,用於函數指針的生命,見下一條
例如: typedef int (*func)(void)
描述: func等價於int (*)(void)類型
func pf等價於int (*pf)(void)聲明,pf是一個函數指針變量
#define 是 C 指令,用於爲各類數據類型定義別名,與 typedef 相似,可是它們有如下幾點不一樣:
1.從功能範圍上講,Typedef用來定義類型的別名,這些類型不僅包含內部類型(int,char等),還包括自定義類型(如struct),能夠起到使類型易於記憶的功能。它還有另一個重要的用途,那就是定義機器無關的類型 。#define不僅是能夠爲類型取別名,還能夠定義常量、變量、編譯開關等。
typedef主要是爲已存在的關鍵字或類型及其組合取一個咱們容易識別的別名。在這一點上#define也可實現,但初次以外#define還有不少其它用處,若是願意你可使用它定義任何代碼,這時typedef所不具有的。
2.從執行時間上講,對於#define定義的宏,其在預處理階段就會被替換。而typedef定義的類型會在編譯時處理。
3.從做用於上來說,通常來講#define定義的宏沒有做用域的限制,只要在使用前有定義就能夠了。而typedef定義的別名是有做用域的。
4.從實現效果來說,咱們使用typedef定義一個指針類型,而後使用該類型能夠同時聲明對各變量,而#define卻不是這樣的。如typedef (int*) pType;可使用pType a,b;這裏a和b都是指向整數的指針變量。但咱們一樣定義#define pType int*,若使用pType a,b;定義a和b,則a是指向整數的指針變量,而b不是。
總結:結合上文,不難看出,在對數據類型名進行自定義時,採用typedef更爲保險,固然也非一成不變的規律,主要是理解兩者的區別,依狀況選用。
a)、第一步,使用已知的類型定義替代typdef後面的名稱,直到只剩下一個名字不識別爲正確;
b)、第二步,未知名字爲定義類型,類型爲取出名稱和typedef的全部部分;
c)、第三步,定義一個變量時,變量類型等價於把變量替代未知名字的位置所獲得的類型。
若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!
【C語言C++學習企鵝圈子】,分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習書籍:
編程學習視頻: