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;
}
規范最好用第一種。
