學習筆記17 C語言 結構 聯合 列舉

2021-10-14 11:08:45 字數 1616 閱讀 9967

結構是由程式猿自己設計的一種資料型別,用於描述乙個事務的各項資料,由若干個不同的基礎資料型別組成。

設計結構:

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...