水滴石穿C語言之typedef的問題(轉)

1. 基本解釋 typedefC語言的關鍵字,做用是爲一種數據類型定義一個新名字。這裏的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct等)。 在編程中使用typedef目的通常有兩個,一個是給變量一個易記且意義明確的新名字,另外一個是簡化一些比較複雜的類型聲明。至於typedef有什麼微妙之處,請你接着看下面對幾個問題的具體闡述。html

2. typedef & 結構的問題 當用下面的代碼定義一個結構時,編譯器報了一個錯誤,爲何呢?莫非C語言不容許在結構中包含指向它本身的指針嗎?請你先猜測一下,而後看下文說明: c++

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


答案與分析1typedef的最簡單使用數據結構

typedef long byte_4;spa


給已知數據類型long起個新名字,叫byte_42 typedef與結構結合使用指針

typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
orm


這語句實際上完成兩個操做:1) 定義一個新的結構類型htm

struct tagMyStruct
{
int iNum;
long lLength;
};
blog


分析:tagMyStruct稱爲「tag」,即標籤,其實是一個臨時名字,struct 關鍵字和tagMyStruct一塊兒,構成了這個結構類型,不管是否有typedef,這個結構都存在。 咱們能夠用struct tagMyStruct varName來定義變量,但要注意,使用tagMyStruct varName來定義變量是不對的,由於struct tagMyStruct合在一塊兒才能表示一個結構類型。

2) typedef爲這個新的結構起了一個名字,叫MyStructget

typedef struct tagMyStruct MyStruct;


所以,MyStruct實際上至關於struct tagMyStruct,咱們可使用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語言編譯器支持這種作法。

3)、規範作法:

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

閱讀全文
類別: c/c++  查看評論
相關文章
相關標籤/搜索