1.結(jié)構(gòu)體的定義:
允許用戶自己建立由不同類型數(shù)據(jù)組成的組合型的數(shù)據(jù)結(jié)構(gòu),它稱為結(jié)構(gòu)體(實際上應(yīng)稱為 結(jié)構(gòu)體類型)。
2.下面以一個結(jié)構(gòu)體實例來說明一下struct的用法:
struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
};
Sturct 是聲明結(jié)構(gòu)體類型時所必須使用的關(guān)鍵字,不能省略。
os_tcb 是結(jié)構(gòu)體名
花括號內(nèi) 是該結(jié)構(gòu)體所包括的子項,稱為結(jié)構(gòu)體成員。
前面只是建立了一個結(jié)構(gòu)體類型,它相當(dāng)于一個模型,并沒有定義變量,其中并無具體數(shù)據(jù),系統(tǒng)對之也不分配存儲單元。為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),應(yīng)當(dāng)定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù)。
可以采取以下3中方式定義結(jié)構(gòu)體類型變量。
(1)先聲明結(jié)構(gòu)體類型,再定義該類型的變量
定義上面的結(jié)構(gòu)體類型后
struct os_tcb OS_TCB; // 在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之
| | // 分配內(nèi)存單元
結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名
(2)在聲明類型的同時定義變量
struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
} OS_TCB; // OS_TCB 是一個結(jié)構(gòu)體變量
(3)不指定類型名而直接定義結(jié)構(gòu)體類型變量
struct
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
} OS_TCB; // OS_TCB 是一個結(jié)構(gòu)體變量
指定了一個無結(jié)構(gòu)體名的結(jié)構(gòu)體類型,顯然不能再以此結(jié)構(gòu)體類型去定義其他變量。
注:結(jié)構(gòu)體類型與結(jié)構(gòu)體變量是不同的概念,不要混同。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取后運算。在編譯時,對類型不分配空間,只對變量分配空間。
3.下面再以此結(jié)構(gòu)體實例來說明一下typedef struct的用法:
(主要參考技術(shù)博客:http://dzdesigned80.blog.163.com/blog/static/203259238201245105525341/)
閱讀程序發(fā)現(xiàn)兩種用 typedef struct 定義結(jié)構(gòu)體的方法
第一種:
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;
可以看出,上面的區(qū)別在于 typedef struct 后面一個跟了標(biāo)識符,另外一個沒有跟標(biāo)識符,這兩個有什么區(qū)別呢?這里的os_tcb代表什么?OS_TCB的意義又是什么?
要搞清楚上面的問題,要從兩方面入手。
第一 typedef的用法是什么?
typedef是在基本類型的基礎(chǔ)上定義類型的同義字。注意typedef并不產(chǎn)生新的類型。例如 typedef int exam_score;這里的exam_score 就是一種基本類型,它的意義等同于 int,那么機(jī)可以用它來定義變量,exam_score LIMING。
第二 結(jié)構(gòu)體的定義各個標(biāo)志符的意義。
在結(jié)構(gòu)體定義中,通常是這樣的
struct exam_score
{
chine;
english;
math;
physical;
chemistry;
}LIMING;
這里的struct是結(jié)構(gòu)體關(guān)鍵字,exam_score則是結(jié)構(gòu)體類型名,LIMING則是結(jié)構(gòu)體變量。
弄明白以上兩個問題,回過頭來看開始的那兩個結(jié)構(gòu)體。
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB; // OS_TCB是一個結(jié)構(gòu)體類型 = struct os_tcb
這里聲明一種結(jié)構(gòu)體類型os_tcb,所以os_tcb就是結(jié)構(gòu)體類型名;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是一個結(jié)構(gòu)體類型 = struct
在結(jié)構(gòu)體的定義中允許這樣形式的定義:
struct
{
xxx
xxx
xxx
}var;
這里沒有聲明結(jié)構(gòu)體變量名,直接定義了結(jié)構(gòu)體變量var,var在這里是結(jié)構(gòu)體變量。這樣定義的結(jié)果是在程序不能再定義新的結(jié)構(gòu)體變量。
這種形式加上typedef 之后情況就變了,這里的OS_TCB不是結(jié)構(gòu)體變量,而是struct的同義字(結(jié)構(gòu)體類型),這個同義僅限于上面定義的那種情況,可以用OS_TCB來定義結(jié)構(gòu)體變量。
總結(jié):
有了以上敘述與理解,我們便可以很容易搞清楚一個易混淆的點:struct{}后面的到底是結(jié)構(gòu)體變量名,還是結(jié)構(gòu)體類型名。
當(dāng)只是定義結(jié)構(gòu)體類型:
struct 結(jié)構(gòu)體名
{
結(jié)構(gòu)體成員名
}結(jié)構(gòu)體變量名;
引用結(jié)構(gòu)體成員方式應(yīng)是:
結(jié)構(gòu)體變量名. 結(jié)構(gòu)體成員名 //結(jié)構(gòu)體變量直接引用結(jié)構(gòu)體成員
當(dāng)使用typedef定義時:
typedef struct 結(jié)構(gòu)體名
{
結(jié)構(gòu)體成員名
}結(jié)構(gòu)體類型名;
引用結(jié)構(gòu)體成員方式應(yīng)是:
結(jié)構(gòu)體類型名 xxx;// 定義一個結(jié)構(gòu)體變量
xxx.結(jié)構(gòu)體成員名 // 引用結(jié)構(gòu)體成員
本文發(fā)布于:2023-02-28 21:05:00,感謝您對本站的認(rèn)可!
本文鏈接:http://m.newhan.cn/zhishi/a/1677723468102653.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時內(nèi)刪除。
本文word下載地址:typedefstruct(typedef struct).doc
本文 PDF 下載地址:typedefstruct(typedef struct).pdf
| 留言與評論(共有 0 條評論) |