typedef struct用法詳解與小結


1.基本解釋

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

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

2. typedef和結構的問題

當使用下面的代碼定義一個結構時,編譯器會報告一個錯誤,為什么呢?莫非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的結構體,實現方法為“新名稱 + 結構變量名”。
 
        
 
        
 








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM