結構是由程式猿自己設計的一種資料型別,用於描述乙個事務的各項資料,由若干個不同的基礎資料型別組成。
設計結構:
struct 結構體名
;定義結構體變數
struct 結構體名 變數名;
注意:定義結構變數時,struct不能省略
定義並初始化結構變數 struct 結構體名 變數名 = ; 根據成員的順序進行初始化
也可以 struct 結構體名 變數名 = 只初始化某些成員
同型別的結構變數可以直接賦值
訪問成員:
變數名.成員名;
結構指標->成員名;
結構體變數作為形參時:
由於結構變數的位元組數都比較大,值傳遞效率比較低,因此都傳遞結構體變數的位址
如果不需要修改結構變數的值,可以用const保護
typedef 重定義結構型別:
typedef struct 結構名 結構名;
之後就可以不用加struct關鍵字
typedef struct 結構體名
結構體名;
注意:結構體變數一般儲存在堆記憶體
計算結構體的位元組數
結構體成員的順序會影響它的總位元組數大小,在設計結構體時,如果順序合理能夠大大節約記憶體。
記憶體對齊:
假設第乙個成員從零位址開始,儲存每個成員的位址編號必須能被比它的位元組數整除,如果不能會填充空位元組
記憶體補齊:
結構體的總位元組數,必須是它最大成員位元組數的整數倍,如果不是則在末尾填充空位元組
注意:在linux系統下計算結構體的對齊、補齊時,如果成員的位元組數超過4,則按照4位元組計算
在windows系統,則按照實際情況計算
#pragma pack(n) 設定對齊、補齊的最大位元組數 n<=預設
linux:1、2、4...
聯合與結構的使用方法基本一致,與結構的區別是所有成員共用的一塊記憶體,如果乙個成員的值發生改變,其他成員的值也會隨之發生改變
聯合就是用少量的記憶體對應多個識別符號,從而達到節約記憶體的目的,現在基本上不再使用。
常考的筆試題:
union date
12注意:聯合天然對齊,但計算聯合的位元組數時要考慮記憶體補齊
如何判斷系統是大端系統還是小端系統?
假如十六進製制整數0x01020304儲存在以0x0a為起始的4位元組記憶體中:
個人計算機系統一般都是小端系統,unix伺服器和網路裝置都是大端,網路位元組序也是大端模式的資料
序列化和反序列化
列舉就是一種資料型別,把所有可能出現的值列出來,可以取乙個有意義的名字,除此之外,該型別的變數在等於其他值都是非法的(願望)
enum 列舉名;
列舉就可以看作是一種型別受限的int型別,但是編譯器為了效率並不會檢查資料的值,所以在c語言中列舉可以當作int型別使用
enum dirextion;
如果不給成員值,列舉常量的值預設從0開始,逐漸加1,如果某個設定了值,後面的在它的基礎上加1
為什麼要用列舉:
為無意義的資料取乙個有意義的名字,提高**的可讀性和安全性(比巨集常量安全)
C程式語言 列舉 結構 聯合
標籤 空格分隔 c 10.1.1 列舉 列舉 常量符號化 列舉 列舉型別名字通常並不真的使用,要用的是在大括號裡的名字,因為它們就是常量符號,它們的型別是int,值則依次從0到n。如 就建立了三個常量,red的值是0,yellow的值是1,green的值是2。當需要一些可以排列起來的常量值時,定義列...
文件總結17 C語言基礎
原始檔 hello.c 標頭檔案 用 include包含 關鍵字 關鍵字,32個關鍵字。main是主函式,程式執行入口。return是函式結束的標誌。符號 號是c語言的一種符號,取餘符號 一句 的結束標誌 注釋 注釋一行 的,多行的語句就用 注釋。變數 是變化的,在計算過程中會發生變化的量。函式 函...
結構聯合列舉的學習筆記
結構 結構是由程式設計師自己設計一種資料型別,用於描述乙個事物的各項資料,由若干個不同的基礎型別組成。設計 struct 結構體名 定義結構變數 struct 結構名 變數名 注意 定義結構變數時,struct不能省略。定義結構變數初始化 struct 結構名 變數名 要根據成員的順序初始化 str...