天天看點

c 複合資料類型 結構 枚舉等

結構

​ 由于多種内奸資料類型組成的一個整體,用于描述一個事物的各項資料。

​ 一般結構體設計都是放在頭檔案或者函數外,友善其他檔案和函數調用。

結構變量,成員名;

結構指針-> 成員名;

由于此時編譯時,堆記憶體還沒有配置設定(堆記憶體裡有解釋),是以編譯器還無法初始化,隻能批量指派,或單個指派。

給結構類型重定義:

​ 由于在c語言中struct關鍵詞無法省略,導緻使用時麻煩,可以使用typedef關鍵詞結構重定義類型、

系統為了快速的通路結構的成員,會對結構的成員在記憶體排列時進行對齊和補齊,是以結構成員順序會影響結構的總位元組數,一般結構的總位元組數會 >= 所有成員的位元組數之和。

假定第一個成員使用0位址,所有成員所使用的記憶體位址,必須被他的位元組數整除。

​ 結構的總位元組數,必須是他最大成員的整數倍,如果不是則補充空位元組。

注意:在linux系統中計算對齊、補齊時,成員的位元組超過4時,則按照4自己計算,Windows正常。

聯合:

也是由程式設計的一種資料類型,使用文法與結構一樣,隻是成員的排列方式不同,所有成員共用一塊記憶體,一個成員的值發生變化,其他成員的值也會跟着變化。

特點:一塊記憶體對應多個辨別符,達到節約記憶體的目的,現在已經基本不用。

​ 考點:

他的成員天然是對齊的,但是有記憶體補齊

使用聯合可以判斷大小端系統

系統的大小端:

小端系統:低位資料存儲在低位位址。

大段系統:地位資料存儲在高位位址。

​ 一般個人計算機使用的是小端系統,大端伺服器、網絡裝置使用的是大端,大端位元組序也叫網絡位元組序。

枚舉:

​ 枚舉是一種特殊的整型資料,他是把一個整型資料可能出現的值全部羅列出來并取一個有意義的名字(枚舉值),除此之外不應該 再使用其他的值,以此保證資料的安全性,提高程式的可讀性。

​ 設計好的枚舉類型,可以下定義枚舉變量,而枚舉變量隻能指派為枚舉值,以此保證資料的安全性。

注意:編譯器為了速度,并不會檢查檢查枚舉變量的指派

​ 枚舉值是常量,可以使用在case語句的後面,不用再寫字面值常量,進而提高程式的可讀性

​ 枚舉值在不指定的情況下,第一個預設為0,之後的逐漸加1,可以單個指定。可以定義匿名枚舉,隻使用枚舉值。

預處理指令

​ 程式員所編寫的c代碼并不能直接被編譯,而是需要一段程式預先翻譯成标準的c代碼,負責處理的程式就叫預處理器,翻譯的過程就叫做預處理,被翻譯的代碼就叫做預處理指令,所有預處理指令都是以#開頭

include 把頭檔案插入目前檔案中

​ #include<> 從系統指定的路徑下查找頭檔案,并插入目前檔案中。

​ #include"" 先從目前路徑下查找頭檔案,如果沒有再從系統指定路徑下查找頭檔案,然後再插入目前檔案中。

​ 定義号宏常量

​ #define 宏名 (字面值)

​ 注意:末尾不要加分号

​ 作用:用辨別符來替代字面值資料,進而提高代碼的可讀性,可擴充性。

​ 代碼在預處理時所使用的宏名會被替換成字面值。

​ #define 宏名(a,b,c) (a+b+c)

​ 不是真正的函數,而是在使用了帶參數的宏,預處理時使用了帶參宏的位置替換成宏名後面的語句,所提供的的參數也會被替換到語句中的位置。

不是真正的函數調用,沒有參數傳遞過程,也沒有傳回值

不限制參數類型,任何類型都可以使用,代碼的通用性強

沒有類型檢查,安全性低

過多使用會造成代碼冗SW餘,導緻代碼段增大,浪費記憶體。

可能會有二義性(多加點括号)

給每個參數加一個小括号,避免産生二義性

使用小括号、大括号包含整個宏函數代碼,進行保護

宏函數不能換行可以使用續行符 \ 來分行一下,但是還是一行

宏函數參數不要使用自變運算符。

​ 定義一個交換兩個變量的宏函數,要任何類型的變量都可以使用

the first way

the second way