嵌入式C語言完全學習筆記(八)

9、結構體、共用體、枚舉、宏定義、預處理
9.1、結構體
9.1.1、爲什麼需要結構體?
沒有結構體之前,在C語言中,數據的組織依靠:變量+數組。
最初最簡單的時候,只需要使用基本數據類型(int char float double)來定義單個變量,需要幾個變量就定義幾個。
後來情況變複雜了,有時需要很多意義相關的變量(譬如需要存儲及運算一個班級的學生分數)這時候數組出現了。數組解決了需要很多類型相同、意義相關的變量的問題。
但是數組是有限制的。數組最大的不足在於,一個數組只能存儲很多個數據類型相同的變量。
所以碰到需要封裝幾個類型不同的變量的時候,數組就無能爲力。
譬如對於題目:使用一個數據結構來保存一個學生的所有信息:姓名 學號 性別
這時候就需要結構體。

9.2、什麼是結構體?
結構體是一個集合,集合中包含很多個元素,這些元素的數據類型可以相同,也可以不相同。所以結構體是一種數據封裝的方法。結構體存在的意義就在於,把很多數據類型不相同的變量封裝在一起,組成一個大的新的數據類型。

數據結構:把龐大複雜的數據用一定的方式組織管理起來,便於操作(查找,增加,刪除等)這就叫數據結構。


9.3、結構體和數組的關聯:數組是一種特殊的結構體,特殊之處在於封裝內的各個元素類型是相同的。結構體和數組都是對一些子元素的封裝,因此定義的時候都是封裝作爲整體定義,但是使用的時候,都是使用封裝中的子元素。一般結構體變量和數組變量都不會作爲一個整體操作。

9.4、使用結構體的步驟:
第一步:定義結構體類型。結構體類型的定義是在函數外面(函數外面 == 全局)的
第二步:使用第一步定義的類型來定義結構體變量。
第三步:使用變量。實際上使用結構體變量的時候,使用的是結構體變量中封裝的各個子元素,而不是結構體變量本身。

9.5、結構體的初始化
結構體變量和普通變量一樣,作爲局部變量時,如果定義的時候無初始化也無顯式賦值,則結構體變量中的子元素的值是隨機的。

發現2種C語言接受的結構體初始化方式。
第一種,完全初始化。{xx, xx, xx, xx, xx};
第二種,部分初始化。
{
    .a = xx,
    .b = xx,
    .c = xx,
    .d = xx,
};


新增關鍵字: struct
新增操作符: .


9.6、宏定義
#define N 321            //宏定義的格式
宏定義要注意的問題:
1、宏定義一般是在函數的外面
2、宏定義必須要先定義,再使用宏。如果先使用就會編譯報錯。
3、宏定義中宏名一般用大寫。不是語法規定的,是一般約定俗成的。

爲什麼使用宏定義?
在C語言中,一般使用常數的時候,都不是直接使用,而是先把該常數定義爲一個宏,然後在程序中使用該宏名。這樣做的好處是,等我們需要修改這個常數時,只需要在宏定義處修改一次即可。而不用到代碼中到處去尋找,看哪裏都用過該常數。


9.7、枚舉

9.6、共用體(union,聯合,聯合體)
9.6.1、共用體union在定義和使用形式上,和結構體struct很相似。但是兩種數據結構是完全不同的兩類東西。
結構體,是對多個數據的組合與封裝。
共用體,共用體中只有一個東西,只是它被好幾個名字(和類型)共用。


char -128 ~ 127
int -xxxx ~ + xxxx

新增關鍵字:union

基礎知識:
1、double float用%f打印,char用%c和%d打印,int用%d,字符串用%s打印,指針用%p打印


2、
C語言基礎大模塊:
數據類型
運算符
三種程序結構
函數
數組
指針
結構體、公用體、枚舉、宏定義、預處理


基礎知識 + 推斷能力
學習 = 基礎知識 + 合理推論


 

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