struct和typedef struct的區別

2021-06-26 14:09:15 字數 2005 閱讀 6666



1. 基本解釋

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

在程式設計中使用typedef目的一般有兩個,乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。

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

2. typedef & 結構的問題

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

typedef struct tagnode

*pnode;

答案與分析:

1、typedef的最簡單使用

typedef long byte_4;

給已知資料型別long起個新名字,叫byte_4。

2、 typedef與結構結合使用

typedef struct tagmystruct

mystruct;

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

1) 定義乙個新的結構型別

struct tagmystruct

;分析: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 

*pnode;

2)、typedef struct tagnode *pnode;

struct tagnode 

;注意:在這個例子中,你用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

struct和typedef struct的區別

1 在c中定義乙個結構體型別要用typedef typedef struct student stu 於是在宣告變數的時候就可 stu stu1 如果沒有typedef就必須用struct student stu1 來宣告 這裡的stu實際上就是struct student的別名。stu struc...

struct和typedef struct的區別

在c中定義乙個結構體型別要用typedef typedef struct student stu 於是在宣告變數的時候就可以 stu stu1 如果沒有typedef就必須用struct student stu1 來宣告 這裡的stu實際上就是struct student的別名。stu struct...

struct和typedef struct的區別

1 structtest1 好,定義了 結構 test1,test1.x 和 test1.y 可以在語句裡用了。2 struct test test1 好,定義了 結構 test1,test1.x 和 test1.y 可以在語句裡用了。與 1 比,省寫 了 test 3 typedef struct...