typedef struct用法詳解與小結

1.基本解釋編程

typedef爲C語言的關鍵字,做用是爲一種數據類型定義一個新名字,這裏的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct等)。數據結構

在編程中使用typedef的目的通常有兩個,一個是給變量一個易記且意義明確的新名字,另外一個是簡化一些比較複雜的類型聲明。至於typedef有什麼微妙之處,我將具體根據如下幾個問題展開闡述。函數

2. typedef和結構的問題spa

當使用下面的代碼定義一個結構時,編譯器會報告一個錯誤,爲何呢?莫非C語言不容許在結構中包含指向它本身的指針嗎?請看下文說明:指針

typedef struct tagNode { char *pItem; pNode pNext; } *pNode;
推理與分析:
(1) typedef的最簡單使用:typedef long byte_4; 給一直數據類型long起個新名字,叫作byte_4;
(2) typedef與結構結合使用;
typedef struct tagMyStruct { int iNum; long lLength; } MyStruct;
這句話實際上完成了兩個操做:
第一,定義了一個結構類型:
struct tagMyStruct { int iNum; long lLength; };
分析:tagMyStruct被稱爲「標籤」(或結構標識符),是該結構體類型,struct關鍵字和tagMyStruct一塊兒,構成了這個新的結構體。
第二,typedef爲這個新的結構起了一個名字,叫作MyStruct,即typedef struct tagMyStruct MyStruct;
此時,MyStruct在功能上與struct tagMystruct等價。例如,當須要建立一個名稱爲varName,類型爲tagMyStruct的結構體是,能夠使用以下兩種方法:
方法一:struct + 類型名稱 + 結構體變量名稱
struct tagMyStruct varName;
方法二:新名稱 + 結構體變量名稱
MyStruct varName;
答案與分析:
C語言固然容許在結構中包含指向它本身的指針,咱們能夠在創建鏈表等數據結構的實現上看到無數這樣的例子,上述代碼的根本問題在於typedef的應用。根據咱們上面的闡述能夠知道:新結構創建的過程當中遇到了pNext域的聲明,類型是pNode,要知道pNode表示的是類型的新名字,那麼在類型自己尚未創建完成的時候,這個類型的新名字還尚不存在,也就是說在這個時候,編譯器根本就不認識pNode。那麼,要解決這個問題的方法就有多種,以下:
// 方法1:  typedef struct tagNode{ char  *pItem; struct tagNode  *pNext; } *pNode; // 方法2: typedef struct tagNode *pNode; struct tagNode{ char  *pItem; pNode  pNext; }; /* 注意:在這個例子中,你用typedef給一個還未徹底聲明的結構類型起新名字,C語言編譯器支持這種作法。*/
struct在代碼中常見的形式有兩種:
// 第一種: struct A { …… }; // 第二種: struct { …… } A;
這是兩種徹底不一樣的用法:
後者是定義結構體變量,意思是:定義一個名稱爲「A」的結構體變量。這裏的結構體稱之爲匿名結構體,是沒法被直接引用的。爲了使該匿名結構體可以被引用,能夠經過typedef爲其建立一個別名,從而使得它能夠被應用,實現方法以下:
typedef struct { //…… } A; //定義匿名結構體的別名爲A
注意結構類型和結構變量名的區別:結構類型該結構體的類型,結構變量名是一個變量名稱,但變量的類型是該結構體類型。對於結構類型已知的結構體,咱們可以經過「struct + 結構類型 + 結構變量名;」的方法來聲明新的結構變量,而未定義類型的結構體則不能直接進行新的結構變量的定義。例如,如今我要在某函數中聲明一個結構變量名爲SHZ的結構體,若結構名已知,則可經過語句:struct + 結構類型 + SHZ;的形式來聲明。對於結構類型未知的結構體,則須要經過使用typedef爲該結構體起一個新的名字,而後才能利用該結構別名來聲明一個結構變量名爲SHZ的結構體,實現方法爲「新名稱 + 結構變量名」。
相關文章
相關標籤/搜索