struct和typedef struct 結構體定義區別

1.結構體的定義:

   允許用戶自己建立由不同類型數據組成的組合型的數據結構,它稱爲結構體(實際上應稱爲 結構體類型)。

 

2.下面以一個結構體實例來說明一下struct的用法:

struct os_tcb

{

  OS_STK    *OSTCBStkPtr;

  OS_STK    *OSTCBStkBottom;     

  INT32U      OSTCBStkSize;     

  INT16U      OSTCBOpt;         

  INT16U      OSTCBId;            

};

Sturct       是聲明結構體類型時所必須使用的關鍵字,不能省略。

os_tcb      是結構體名

花括號內   是該結構體所包括的子項,稱爲結構體成員。

 

前面只是建立了一個結構體類型,它相當於一個模型,並沒有定義變量,其中並無具體數據,系統對之也不分配存儲單元。爲了能在程序中使用結構體類型的數據,應當定義結構體類型的變量,並在其中存放具體的數據。

可以採取以下3中方式定義結構體類型變量。

(1)先聲明結構體類型,再定義該類型的變量

定義上面的結構體類型後

struct os_tcb    OS_TCB;    // 在定義了結構體變量後,系統會爲之

         |                       |            // 分配內存單元

結構體類型名      結構體變量名  

     

(2)在聲明類型的同時定義變量

struct os_tcb

{

  OS_STK    *OSTCBStkPtr;

  OS_STK    *OSTCBStkBottom;     

  INT32U      OSTCBStkSize;     

  INT16U      OSTCBOpt;         

  INT16U      OSTCBId;            

} OS_TCB;     // OS_TCB 是一個結構體變量

 

(3)不指定類型名而直接定義結構體類型變量

struct 

{

  OS_STK    *OSTCBStkPtr;

  OS_STK    *OSTCBStkBottom;     

  INT32U      OSTCBStkSize;     

  INT16U      OSTCBOpt;         

  INT16U      OSTCBId;            

} OS_TCB;     // OS_TCB 是一個結構體變量

 

指定了一個無結構體名的結構體類型,顯然不能再以此結構體類型去定義其他變量。

 

注:結構體類型與結構體變量是不同的概念,不要混同。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取後運算。在編譯時,對類型不分配空間,只對變量分配空間。

 

 

3.下面再以此結構體實例來說明一下typedef struct的用法:

(主要參考技術博客:http://dzdesigned80.blog.163.com/blog/static/203259238201245105525341/)

閱讀程序發現兩種用 typedef struct 定義結構體的方法

第一種:

typedef struct os_tcb

{

  OS_STK    *OSTCBStkPtr;

  OS_STK    *OSTCBStkBottom;     

  INT32U      OSTCBStkSize;     

  INT16U      OSTCBOpt;         

  INT16U      OSTCBId;            

}OS_TCB;

第二種:

typedef struct 

{

  OS_STK    *OSTCBStkPtr;

  OS_STK    *OSTCBStkBottom;     

  INT32U      OSTCBStkSize;     

  INT16U      OSTCBOpt;         

  INT16U      OSTCBId;            

}OS_TCB;

 

可以看出,上面的區別在於 typedef struct 後面一個跟了標識符,另外一個沒有跟標識符,這兩個有什麼區別呢?這裏的os_tcb代表什麼?OS_TCB的意義又是什麼?

 

要搞清楚上面的問題,要從兩方面入手。

第一 typedef的用法是什麼?

typedef是在基本類型的基礎上定義類型的同義字。注意typedef並不產生新的類型。例如 typedef int exam_score;這裏的exam_score 就是一種基本類型,它的意義等同於 int,那麼機可以用它來定義變量,exam_score LIMING。

第二 結構體的定義各個標誌符的意義。

在結構體定義中,通常是這樣的

struct exam_score

{

chinese;

english;

math;

physical;

chemistry;

}LIMING;

這裏的struct是結構體關鍵字,exam_score則是結構體類型名,LIMING則是結構體變量。

弄明白以上兩個問題,回過頭來看開始的那兩個結構體。

typedef struct os_tcb

{

  OS_STK    *OSTCBStkPtr;

  OS_STK    *OSTCBStkBottom;     

  INT32U      OSTCBStkSize;     

  INT16U      OSTCBOpt;         

  INT16U      OSTCBId;            

}OS_TCB; // OS_TCB是一個結構體類型 = struct os_tcb

這裏聲明一種結構體類型os_tcb,所以os_tcb就是結構體類型名;OS_TCB是struct os_tcb 的同義字,所以可以直接用OS_TCB來定義變量,同時也可以這樣 struct os_tcb xxx,OS_TCB xxx;都是合法的,因爲OS_TCB就等同於      

struct os_tcb。

 

來看第二種

typedef struct 

{

  OS_STK    *OSTCBStkPtr;

  OS_STK    *OSTCBStkBottom;     

  INT32U      OSTCBStkSize;     

  INT16U      OSTCBOpt;         

  INT16U      OSTCBId;            

}OS_TCB;    // OS_TCB是一個結構體類型 = struct 

在結構體的定義中允許這樣形式的定義:

struct

{

xxx

xxx

xxx

}var;

這裏沒有聲明結構體變量名,直接定義了結構體變量var,var在這裏是結構體變量。這樣定義的結果是在程序不能再定義新的結構體變量。

這種形式加上typedef 之後情況就變了,這裏的OS_TCB不是結構體變量,而是struct的同義字(結構體類型),這個同義僅限於上面定義的那種情況,可以用OS_TCB來定義結構體變量。

 

總結:

有了以上敘述與理解,我們便可以很容易搞清楚一個易混淆的點:struct{}後面的到底是結構體變量名,還是結構體類型名。

 

當只是定義結構體類型:

struct 結構體名

{

        結構體成員名

 

}結構體變量名;

引用結構體成員方式應是:

結構體變量名. 結構體成員名  //結構體變量直接引用結構體成員

 

當使用typedef定義時:

typedef struct 結構體名

{

        結構體成員名

 

}結構體類型名;

引用結構體成員方式應是:

結構體類型名 xxx;// 定義一個結構體變量

xxx.結構體成員名  // 引用結構體成員
--------------------- 
作者:SudekiMing 
來源:CSDN 
原文:https://blog.csdn.net/WalterBrien/article/details/79624405 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章