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
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!