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