typedef結構體


typedef struct BiTNode{
    TElemType  data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef的定義:

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

在編程中使用typedef目的一般有兩個,一個是給變量一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。


 

例如:typedef int k;   則k就是int的別名。 用k就可以代替int。

開頭的代碼可以寫成如下:

typedef struct BiTNode{ TElemType  data;  struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;
可以看出:
struct是一個結構體,然后typedef 對結構體賦予別名。

  c語言的結構體是應該這樣定義的:

struct  tagMyStruct

 int iNum; 
 long lLength; 
};

分析:tagMyStruct稱為“tag”,即“標簽”,實際上是一個臨時名字,struct 關鍵字和tagMyStruct一起,構成了這個結構類型,不論是否有typedef,這個結構都存在。

我們可以用struct  tagMyStruct  Name來定義變量,但要注意,使用tagMyStruct Name來定義變量是不對的,因為struct 和tagMyStruct合在一起才能表示一個結構類型。

當如下定義的時候:

typedef struct tagMyStruct

 int iNum;

 long lLength;

} MyStruct; 

我們就可以用MyStruct來標識struct tagMyStruct  ,也就是說,MyStruct是struct tagMyStruct的別名。

 


 

下面有一個錯誤例子:

typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;  

C語言當然允許在結構中包含指向它自己的指針pNode,我們可以在建立鏈表等數據結構的實現上看到無數這樣的例子,上述代碼的根本問題在於typedef的應用。

typedef struct tagNode{char* pltem; pNode pNxet;}*pNode;   這樣子看,

新結構建立的過程中遇到了pNext域的聲明,類型是pNode,要知道pNode表示的是類型的新名字,那么在類型本身還沒有建立完成的時候,這個類型的新名字也還不存在,也就是說這個時候編譯器根本不認識pNode。

解決方法:

第一種解決辦法:

typedef struct tagNode
{
 char *pItem;
 struct tagNode pNext;
} *pNode;  

第二種:

typedef struct tagNode *pNode;

struct tagNode{

 char *pItem;

 pNode pNext;

}

規范最好用第一種。


免責聲明!

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



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