typedef struct 用法詳解和用法小結

typedef struct 用法詳解和用法小結

分類: C基礎 1564人閱讀 評論(0) 收藏 舉報
 

1. 基本解釋

typedefC語言的關鍵字,作用是爲一種數據類型定義一個新名字。這裏的數據類型包括內部數據類型

int,char等)和自定義的數據類型(struct等)。

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

至於typedef有什麼微妙之處,請你接着看下面對幾個問題的具體闡述。

2. typedef & 結構的問題

當用下面的代碼定義一個結構時,編譯器報了一個錯誤,爲什麼呢?莫非C語言不允許在結構中包含指向

它自己的指針嗎?請你先猜想一下,然後看下文說明:

typedef struct tagNode

{

 char *pItem;

 pNode pNext;

} *pNode;

答案與分析:

1typedef的最簡單使用

typedef long byte_4;

給已知數據類型long起個新名字,叫byte_4

2 typedef與結構結合使用

typedef struct tagMyStruct

{

 int iNum;

 long lLength;

} MyStruct;

這語句實際上完成兩個操作:

1) 定義一個新的結構類型

struct tagMyStruct

{

 int iNum;

 long lLength;

};

分析:tagMyStruct稱爲“tag”,即“標籤”,實際上是一個臨時名字,struct 關鍵字和tagMyStruct

一起,構成了這個結構類型,不論是否有typedef,這個結構都存在。

我們可以用struct tagMyStruct varName來定義變量,但要注意,使用tagMyStruct varName來定義變量

是不對的,因爲struct tagMyStruct合在一起才能表示一個結構類型。

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

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)、規範做法:

typedef uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );

這個以前沒有看到過,個人認爲是宇定義一個uint32的指針函數,uint16*, uint32 爲函數裏的兩個參數;

應該相當於#define uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );

struct在代碼中常見兩種形式:

struct A

{

//...

};

struct

{

//...

} A;

這其實是兩個完全不同的用法:

前者叫做“結構體類型定義”,意思是:定義{}中的結構爲一個名稱是“A”的結構體。

這種用法在typedef中一般是:

typedef struct tagA //故意給一個不同的名字,作爲結構體的實名

{

//...

} A; //結構體的別名。

後者是“結構體變量定義,意思是:以{}中的結構,定義一個名稱爲"A"的變量。這裏的結構體稱爲匿名結構體,是無法被直接引用的。

也可以通過typedef爲匿名結構體創建一個別名,從而使得它可以被引用:

typedef struct

{

//...

} A; //定義匿名結構體的別名爲A

===========================================================================
在C中定義一個結構體類型要用typedef:
typedef struct Student
{
int a;
}Stu;
於是在聲明變量的時候就可:Stu stu1;
如果沒有typedef就必須用struct Student stu1;來聲明
這裏的Stu實際上就是struct Student的別名。
另外這裏也可以不寫Student(於是也不能struct Student stu1;了)
typedef struct
{
int a;
}Stu;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章