1、struct _x1 { ...}x1; 和 typedef struct _x2{ ...} x2; 有什麼不同?
前者是定義了類_x1和_x1的對象實例x1, 後者是定義了類_x2和_x2的類別名x2
struct 結構名
{
類型 變量名;
類型 變量名;
...
} 結構變量;
typedef struct 結構名
{
類型 變量名;
類型 變量名;
...
} 結構別名;
在C中,struct不能包含函數。在C++中,對struct進行了擴展,可以包含函數。
2、typedef struct與struct的區別
2.1、typedef爲C語言的關鍵字,作用是爲一種數據類型定義一個新名字。這裏的數據類型包括內部數據類型(int,char等)和自 定義的數據類型(struct等)。在編程中使用typedef目的一般有兩個,一個是給變量一個易記且意義明確的新名字,另一個 是簡化一些比較複雜的類型聲明。
例:
2.1.1、typedef long byte_4; 給已知數據類型long起個新名字,叫byte_4。
2.1.2、
typedef struct tagMyStruct
{
int iNum;
long lLength;
}MyStruct;
上述完成兩個操作1、定義了一個結構體2、給這個結構體取了個別名MyStruct。
注意:
tagMyStruct稱爲“tag”,即“標籤”,實際上是一個臨時名字,struct 關鍵字和tagMyStruct一起,構成了這個結構類型 ,不論是否有typedef,這個結構都存在。
我們可以用struct tagMyStruct varName來定義變量,但要注意,使用tagMyStruct varName來定義變量是不對的, 因爲struct 和tagMyStruct合在一起才能表示一個結構類型。
因此,MyStruct實際上相當於struct tagMyStruct,我們可以使用MyStruct varName來定義變量。
2.2、
typedef
struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
上述錯誤:你用typedef給一個還未完全聲明的類型起新名字
解決:
typedef
struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
typedef struct tagNode *pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};