1:簡單理解,結(jié)構(gòu)體就是數(shù)組的進一步發(fā)展,數(shù)據(jù)的優(yōu)點和缺陷在于數(shù)據(jù)里面是元素類型必須相同,但是結(jié)構(gòu)體沒有這個要求,結(jié)構(gòu)體里面元素的類型可以相同也可以不同。
10年積累的網(wǎng)站制作、網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有興賓免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
2:結(jié)構(gòu)體的定義:
struct student { int age; char name[20]; }s1;
上面這種方法是結(jié)構(gòu)體定義的同時定義變量,結(jié)構(gòu)體的定義有兩部分組成
struct studen:結(jié)構(gòu)體的類型
s1:類型為struct student的結(jié)構(gòu)體變量,當然還可以用struct studet s2;l來定義變量s2
注意結(jié)構(gòu)體里面的元素不能再創(chuàng)建的時候直接賦值,而是要通過外部訪問來對結(jié)構(gòu)體進行填充
3:結(jié)構(gòu)體里面變量的訪問
結(jié)構(gòu)體里面的元素訪問方式有兩種,一種是 . 一種是->,但其實質(zhì)上都是通過指針來訪問的。
C語言規(guī)定用結(jié)構(gòu)體的變量來訪問結(jié)構(gòu)體的時候是用 . 用結(jié)構(gòu)體變量的指針來訪問結(jié)構(gòu)體的時候用->
4:結(jié)構(gòu)體的對齊訪問
首先要知道一點,我們使用 . 的方式來訪問結(jié)構(gòu)體時是不同考慮結(jié)構(gòu)體內(nèi)存對齊問題的,這部分編譯器會幫我們處理,但是如果我們想通過指針方式來訪問結(jié)構(gòu)體里面的各元素的時候就需要考慮內(nèi)存對齊的問題。結(jié)構(gòu)體內(nèi)存對齊訪問一個主要原因是硬件本身的物理限制,使用對齊訪問可以提高訪問的效率。但是內(nèi)存對齊也會帶來內(nèi)存空間浪費的問題,所以內(nèi)存對齊訪問實際上是通過犧牲內(nèi)存空間來換取的速度。
5:結(jié)構(gòu)體對齊的規(guī)則和運算
編譯器本身可以設(shè)置內(nèi)存對齊的規(guī)則,但是一下幾點規(guī)則需要記住
(1)32位編譯器,一般米、默認是4字節(jié)對齊
(2)結(jié)構(gòu)體整體本身必須安置在4字節(jié)對齊處,也就是結(jié)構(gòu)體的首地址必須是4整數(shù)的倍數(shù)(如果編譯設(shè)置為n字節(jié)對齊訪問,則首地址就是n的整數(shù)倍(n = 1 2 4 8 16 ...))
(3)結(jié)構(gòu)體中每個元素本身必須對齊存放
(4)整個結(jié)構(gòu)體的所占的內(nèi)存空間必須是4的整數(shù)倍(同樣如果是n字節(jié)對齊就是n的整數(shù)倍)
struct mystruct1 { //1字節(jié)對齊 //4字節(jié)對齊 int a; // 4 // 4 char b; //1 // 2 short c; //2 // 2 }mystr1; struct mystruct2 { //1字節(jié)對齊 //4字節(jié)對齊 char a; // 1 // 4 (1+3)3字節(jié)填充 int b; //4 // 4 short c; //2 // 4 (2 +2)2字節(jié)填充 }mystr2;
分析:
首先是整個結(jié)構(gòu)體,整個結(jié)構(gòu)體變量4字節(jié)對齊是由編譯器保證的,然后再是第一個元素a,a的開始抵制就是整個結(jié)構(gòu)體的開始地址,所以自然就是4字節(jié)對齊的,但是的結(jié)束地址此時是不確定的,得由下一個元素決定;
第二個元素b,因為上一個元素a本身占4字節(jié),其本身就是對齊的,所以留給b的開始地址也是4字節(jié)對齊,所以b就可直接存放(b存放的開始位置就決定a要占多少個字節(jié),這里因為元素a字節(jié)剛好滿足4字節(jié)對齊,不需要進行填充,所以這里a就占4字節(jié)),b的起始地址決定后,結(jié)束地址的確定需要依賴于下一個元素,原因是可能要進行填充,并且下一個元素的類型不通,則需要填充的字節(jié)數(shù)也是不同的;