堆的使用:
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 而我們又知道在棧中宣告變數的時候,位址是從高到低的分配的.因此,切記在結構體中宣告的變數與直接在外面宣告是不一樣的.在結構體中,最先宣告的變數放在最低位的.另...