C語言之結(jié)構(gòu)體就這樣被攻克了!
「本文目錄」
- 結(jié)構(gòu)體的聲明與定義
- 聲明
- 定義
- 訪問結(jié)構(gòu)體成員
- 初始化結(jié)構(gòu)體
- 對(duì)齊
- 結(jié)構(gòu)體嵌套
- 結(jié)構(gòu)體數(shù)組
- 結(jié)構(gòu)體指針
- 傳遞結(jié)構(gòu)體信息
- 傳遞結(jié)構(gòu)體變量
- 傳遞指向結(jié)構(gòu)體變量的指針
- 動(dòng)態(tài)申請(qǐng)結(jié)構(gòu)體
- 實(shí)戰(zhàn):建立一個(gè)圖書館數(shù)據(jù)庫
- 單鏈表
- 在單鏈表中插入元素
- 搜索單鏈表
- 插入結(jié)點(diǎn)到指定位置
- 刪除結(jié)點(diǎn)
- 內(nèi)存池
- typedef
- 給數(shù)據(jù)類型起別名
- 結(jié)構(gòu)體的搭檔
- 進(jìn)階
- 共用體
- 聲明
- 初始化
- 枚舉
- 位域
有的時(shí)候,我們所遇到的數(shù)據(jù)結(jié)構(gòu),不僅僅是一群數(shù)字或者是字符串那么簡(jiǎn)單。比如我們每一個(gè)人的學(xué)籍信息,學(xué)號(hào)是一個(gè)長(zhǎng)整數(shù),名字卻是字符;甚至有更復(fù)雜的情況,這種問題在現(xiàn)實(shí)生活中并不少見。我們之前學(xué)過一種叫數(shù)組的數(shù)據(jù)結(jié)構(gòu),它可以允許我們把很多同類型的數(shù)據(jù)集中在一起處理。相對(duì)于之前,這已經(jīng)是一次極大的進(jìn)步。但是,新的問題,往往又會(huì)出現(xiàn),這個(gè)時(shí)候,我們就得上更高端的裝備——結(jié)構(gòu)體。相比于數(shù)組,結(jié)構(gòu)體有以下的更強(qiáng)大的優(yōu)勢(shì):
- 批量存儲(chǔ)數(shù)據(jù)
- 存儲(chǔ)不同類型的數(shù)據(jù)
- 支持嵌套
結(jié)構(gòu)體的聲明與定義
聲明
結(jié)構(gòu)體的聲明使用struct
關(guān)鍵字,如果我們想要把我們的學(xué)籍信息組織一下的話,可以這樣表示:struct?Info
{
????unsigned?long?identifier;//學(xué)號(hào),用無符號(hào)長(zhǎng)整數(shù)表示
????char?name[20];//名字,用字符數(shù)組表示
????unsigned?int?year;//入學(xué)年份,用無符號(hào)整數(shù)表示
????unsigned?int?years;//學(xué)制,用無符號(hào)整數(shù)表示
}
這樣,我們就相當(dāng)于描繪好了一個(gè)框架,以后要用的話直接定義一個(gè)這種類型的變量就好了。定義
我們剛剛申請(qǐng)了一個(gè)名叫Info
的結(jié)構(gòu)體類型,那么理論上我們可以像聲明其他變量的操作一樣,去聲明我們的結(jié)構(gòu)體操作,但是C語言中規(guī)定,聲明結(jié)構(gòu)體變量的時(shí)候,struct
關(guān)鍵字是不可少的。struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變量名
不過,你可以在某個(gè)函數(shù)里面定義:#include?
struct?Info
{
????unsigned?long?identifier;//學(xué)號(hào),用無符號(hào)長(zhǎng)整數(shù)表示
????char?name[20];//名字,用字符數(shù)組表示
????unsigned?int?year;//入學(xué)年份,用無符號(hào)整數(shù)表示
????unsigned?int?years;//學(xué)制,用無符號(hào)整數(shù)表示
};
int?main(void)
{
????/**
?????*在main函數(shù)中聲明結(jié)構(gòu)體變量
?????*結(jié)構(gòu)體變量名叫info
?????*struct關(guān)鍵字不能丟
?????*/
????struct?Info?info;
????...
}
也可以在聲明的時(shí)候就把變量名定義下來(此時(shí)這個(gè)變量是全局變量):#include?
struct?Info
{
????unsigned?long?identifier;//學(xué)號(hào),用無符號(hào)長(zhǎng)整數(shù)表示
????char?name[20];//名字,用字符數(shù)組表示
????unsigned?int?year;//入學(xué)年份,用無符號(hào)整數(shù)表示
????unsigned?int?years;//學(xué)制,用無符號(hào)整數(shù)表示
}?info;
/**
?*此時(shí)直接定義了變量
?*該變量是全局變量
?*變量名叫info
?*/
int?main(void)
{
????...
}
訪問結(jié)構(gòu)體成員
結(jié)構(gòu)體成員的訪問有點(diǎn)不同于以往的任何變量,它是采用點(diǎn)號(hào)運(yùn)算符.
來訪問成員的。比如,info.name
就是引用info
結(jié)構(gòu)體的name
成員,是一個(gè)字符數(shù)組,而info.year
則可以查到入學(xué)年份,是個(gè)無符號(hào)整型。比如,下面開始錄入學(xué)生的信息://Example?01
#include?
struct?Info
{
????unsigned?long?identifier;//學(xué)號(hào),用無符號(hào)長(zhǎng)整數(shù)表示
????char?name[20];//名字,用字符數(shù)組表示
????unsigned?int?year;//入學(xué)年份,用無符號(hào)整數(shù)表示
????unsigned?int?years;//學(xué)制,用無符號(hào)整數(shù)表示
};
int?main(void)
{
????struct?Info?info;
????printf("請(qǐng)輸入學(xué)生的學(xué)號(hào):");
????scanf("%d",?