天天看點

typedef struct 用法詳解和用法小結(一)

本文出處:http://c.chinaitlab.com/c/basic/200908/792134.html

第一篇:typedef struct與struct的差別

1. 基本解釋

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

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

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

2. typedef & 結構的問題

當用下面的代碼定義一個結構時,編譯器報了一個錯誤,為什麼呢?莫非C語言不允許在結構中包含指向它自己的指針嗎?請你先猜想一下,然後看下文說明:

typedef struct tagNode

{

 char *pItem;

 pNode pNext;

} *pNode;

答案與分析:

1、typedef的最簡單使用

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和C++中struct和typedef struct的差別

在C和C++有三種定義結構的方法。

typedef struct {

int data;

int text;

} S1;

//這種方法可以在c或者c++中定義一個S1結構

struct S2 {

int data;

int text;

};

// 這種定義方式隻能在C++中使用,而如果用在C中,那麼編譯器會報錯

struct {

int data;

int text;

} S3;

這種方法并沒有定義一個結構,而是定義了一個s3的結構變量,編譯器會為s3記憶體。

void main()

{

S1 mine1;// OK ,S1 是一個類型

S2 mine2;// OK,S2 是一個類型

S3 mine3;// ERROR, S3 不是一個類型

S1.data = 5;// ERROR S1 是一個類型

S2.data = 5;// ERROR S2 是一個類型

S3.data = 5;// OK S3是一個變量

}

第三篇:struct和typedef struct

分三塊來講述:

1 首先: 

在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;

但在c++裡很簡單,直接

struct Student

{

int a;

};

于是就定義了結構體類型Student,聲明變量時直接Student stu2;

===========================================

2、其次: 

在c++中如果用typedef的話,又會造成差別:

struct Student 

int a; 

}stu1;//stu1是一個變量 

typedef struct Student2 

int a; 

}stu2;//stu2是一個結構體類型 

使用時可以直接通路stu1.a

但是stu2則必須先 stu2 s2;

然後 s2.a=10;

===========================================

3 、掌握上面兩條就可以了,不過最後我們探讨個沒多大關系的問題

如果在c程式中我們寫:

typedef struct

{

int num;

int age;

}aaa,bbb,ccc;

這算什麼呢?

我個人觀察編譯器(VC6)的了解,這相當于

typedef struct

{

int num;

int age;

}aaa;

typedef aaa bbb;

typedef aaa ccc;

也就是說aaa,bbb,ccc三者都是結構體類型。聲明變量時用任何一個都可以,在c++中也是如此。但是你要注意的是這個在c++中如果寫掉了typedef關鍵字,那麼aaa,bbb,ccc将是截然不同的三個對象。

繼續閱讀