5 陣列 字串 結構體 共用體 列舉

2022-03-09 05:07:52 字數 2548 閱讀 7985

堆的使用:

malloc的一些細節:

有些特殊資料段會被放到**段:

總結:c語言沒有原生字串型別

c語言使用指標來管理字串

c語言中字串的本質:

注意:儲存多個字元的2種方式:字串和字元陣列

字元陣列初始化與sizeof、strlen

字串初始化與sizeof、strlen

字元陣列與字串的本質差異(記憶體分配角度)

結構體型別是一種自定義型別

結構體使用時先定義結構體型別再用型別定義變數;

#include #include 

struct

peple

;struct

student

s;int

main()

什麼是結構體對齊訪問

結構體為何要對齊訪問

結構體對齊的規則和運算

總結:結構體對齊的分析要點和關鍵:

gcc支援但不推薦的對齊指令:#pragma pack()、#pragma pack(n) (n=1/2/4/8)

gcc推薦的對齊指令__attribute__((packed))、__attribute__((aligned(n)))

#include typedef 

structee;

#pragma pack()typedef

struct

__attribute__((packed)) cc;

//1位元組對齊 2位元組對齊 4位元組對齊 8位元組對齊

struct

mystruct111

__attribute__((aligned(8))) my111;

結構體指標訪問各個元素的原理:

offsetof巨集:

#define offsetof(type, member) (int)(&((type *)0) -> member ),

(type *)0:這是乙個強制型別轉換,把0位址強制型別轉換成乙個指標,這個指標指向乙個type型別的結構體變數。(實際上這個結構體變數可能不存在,但是只要我不去解引用這個指標就不會出錯)。

((type *)0)->member:(type *)0是乙個type型別結構體變數的指標,通過指標指標來訪問這個結構體變數的member元素

&((type *)0)->member:等效於&(((type *)0)->member),意義就是得到member元素的位址。但是因為整個結構體變數的首位址是0,所以這個巨集返回的是member元素相對於整個結構體變數的首位址的偏移量,型別是int;

container_of巨集:

#include //

type是結構體型別,member是結構體中乙個元素的元素名

//這個巨集返回的是member元素相對於整個結構體變數的首位址的偏移量,型別是int

#define offsetof(type, member) (int)(&((type *)0) -> member )

//ptr是指向結構體元素member的指標,type是結構體型別,member是結構體中乙個元素的元素名

//這個巨集返回的就是指向整個結構體變數的指標,型別是(type *)

#define container_of(ptr, type, member) ()

structcc;

int main(void

)

學習指南和要求:

共用體型別的定義、變數定義和使用

#include union myunion

;struct

aaa1;

int main(void

)

共用體和結構體的相同和不同

共用體的主要用途

什麼是大小端模式

經典筆試題:

#include union endian    

//共用體都是從地位址開始訪問的

s;//

小端模式返回1,否則為大端模式

int is_little_endian1(void

)int is_little_endian2(void

)int main(void

)

else

return0;

}

看似可行實則不行的測試大小端方式:位與、移位、強制型別轉化

通訊系統中的大小端(陣列的大小端)

列舉是用來幹嘛的?

c語言為何需要列舉

巨集定義和列舉的區別

#include //

這個列舉用來表示函式返回值,error表示錯誤,right表示正確

enum

return_value

;enum return_value func1(void

)int main(void

)

else

return0;

}

陣列 字串 結構體 共用體 列舉

1 void 是乙個指標型別,malloc返回的是乙個void 型別的指標,實質上malloc返回的是堆管理器分配給我本次申請的記憶體空間的首位址 malloc 返回的值其實是乙個數字,這個數字表示乙個記憶體位址 為什麼要使用void 作為型別?主要原因是malloc幫我們分配記憶體是只分配了記憶體...

第五章 陣列 字串 結構體 共用體 列舉

0x12345678 在記憶體byte0,byte1,byte2,byte3中的存放方法大端模式 0x12 0x34 byte0 byte1 0x560x78 byte2 byte3 2 通過程式確定大小端 通過共用體 定義共用體 union strs1 判斷 int func void int m...

結構體 共用體 列舉

結構體 共用體 列舉 分析 首先宣告的結構體元素year的位址是最低的 0012ff74 而最後宣告的day的位址是最高的 0012ff7c 而我們又知道在棧中宣告變數的時候,位址是從高到低的分配的.因此,切記在結構體中宣告的變數與直接在外面宣告是不一樣的.在結構體中,最先宣告的變數放在最低位的.另...