結構體是一種新的數據類型,對C語言的數據類型進行了極大的擴充。數組
struct STU{ int age; char name[15]; }; struct STU a; //結構體實例 struct STU *b; //結構體指針
一、能夠經過a.age對其進行取成員的操做,b->age也能夠進行結構體的操做,b->age存在問題,必須有一個結構體空間已經讓b指向,b的值爲此結構體空間的地址。
二、a.name = "lilei"; false,由於name是數組名稱,指針常量不能賦值,解決方案:strcpy()函數
三、字符串直接進行比較的話,是其地址的比較,沒有什麼意義,用strcmp()函數進行比較,就是ASCII碼的比較了。函數
操做系統對於內存空間的分配,遵循以下原則:老是從2^n倍數爲地址的字節處開始分配空間。
如:若按4B對其模式的話,則每一個變量(結構體成員)的首地址老是從編號爲4的整數倍的字節處開始分配空間。
可設幾字節對齊以下操作系統
#pragma pack(push) //保持原對齊格式 #pragma pack(1) //設定爲n字節格式 ....... #pragma pack(pop) //恢復爲原對齊格式
一、結構體大小
(1)、總大小是下一個類型的整數倍,不然用單字節補齊(單字節最多補到4/8,具體看結構體中最寬幾字節)
//總大小指的是前面字節總數和當前的字節數之和
(2)、結構體大小是最寬字節的整數倍(通常狀況下爲4或8)
(3)、上述兩個條件必須同時成立。若最終結果不成立的話,則補齊整數倍便可
二、下面舉例論證結構體大小
(1)、指針
struct TEST{ int a; short b; char c; struct TEST *next; };
分析以下:4->2->1 (補1字節)->4 共12字節
(2)、借用(1)中的結構體code
struct TEST1{ short d; int e; char f; struct TEST g; struct TEST1 *next; struct TEST h; char i; };
分析以下:2(補2字節)->4->1(補3字節)->12->4(想補也不能補,最多補到最寬單字節,在這最多到4字節,已經爲4字節了,因此不能在補了)->12->1。
一共爲:41字節,可是結構體大小爲最寬單字節的整數倍,在這應爲4的整數倍,最終,此結構體大小爲44字節。
(3)、借用(1)中的結構體內存
struct TEST2{ short d; int e; double f; struct TEST1 *next; struct TEST g; char i; };
分析以下:2(補2字節)->4->8->4(補4字節:前面一共16字節,當前4字節,因此總共20字節,不是下一個數據類型(12)的整數倍,且最寬爲8字節,可補4字節,構成整數倍)->12->1。
一共爲37字節,可是結構體大小爲最寬單字節的整數倍,在這應爲8的整數倍,最終此結構體大小爲40字節。
結構體類型極大的擴充了C語言,是數據類型更加豐富多彩。字符串