結(jié)構(gòu)基礎知識
C提供了兩種類型的聚合數(shù)據(jù)類型,數(shù)組和結(jié)構(gòu)。數(shù)組是相同類型的元素的集合,但每個結(jié)構(gòu)的成員可以具有不同的類型;
數(shù)組元素通過下標訪問,每個結(jié)構(gòu)成員都是通過成員名字訪問的;
和數(shù)組名不同,當一個結(jié)構(gòu)變量在表達式中使用時,它并不被替換成一個指針;
相同類型的結(jié)構(gòu)體相互之間可以進行賦值;
1、結(jié)構(gòu)聲明
結(jié)構(gòu)成員
機構(gòu)里的成員可以支持任意類型。
結(jié)構(gòu)成員的訪問當變量為結(jié)構(gòu)體本身時,為直接訪問用變量名.加成員名;
當變量為機構(gòu)體的指針時,為簡介訪問,方式為變量名->成員名。
結(jié)構(gòu)的自引用
結(jié)構(gòu)的自引用,不是在結(jié)構(gòu)體里還包含結(jié)構(gòu)體本身類型的成員變量(這個遞歸定義是不可以的),而是在結(jié)構(gòu)體里包含其結(jié)構(gòu)體本身的指針變量。
不完整的聲明
結(jié)構(gòu)的初始化
結(jié)構(gòu)的初始化和多維數(shù)組帶花括號的初始化很相似,一個位于一對花括號內(nèi)部,由逗號分隔的初始值列表可用于結(jié)構(gòu)各個成員的初始化。如果初始列表的值不夠,剩余的結(jié)構(gòu)成員將使用缺省值進行初始化。
struct INIT_EX{
int ? ? ?a;
short ?b[10];
Simple c;
}={
10,
{1,2,3,4,5},
(25,'x',1.9}
};
結(jié)構(gòu)、指針和成員
相互之間的訪問方式就不詳細說了
結(jié)構(gòu)的存儲分配
其中存在對齊要求。為了節(jié)省空間,我們可以通過對機構(gòu)成員重排,但這也許會減少程序的可讀性??臻g和可讀性需要我們自己平衡(可讀性差的時候只能通過加注釋來解決了)。
作為函數(shù)參數(shù)的結(jié)構(gòu)
結(jié)構(gòu)體變量是一個標量,我們可以直接使用按值傳遞傳遞這個變量。但如果一個結(jié)構(gòu)體過大,我們就必須把相應的字節(jié)全部復制到堆棧中,以后再丟棄。這樣實在是沒必要,因此我們一般傳遞結(jié)構(gòu)的指針;
向函數(shù)傳遞指針的缺陷在于函數(shù)現(xiàn)在可以對調(diào)用程序的結(jié)構(gòu)變量進行修改。如果我們不希望如此,可以在函數(shù)中使用const關鍵字修飾。
位段
位段可以實現(xiàn)的功能都可以通過移位和屏蔽來實現(xiàn),只不過位段使用起來更明了些,但位段可移植性很差。
聯(lián)合
在一個成員長度不同的聯(lián)合里,分配給聯(lián)合的內(nèi)存數(shù)量取決于它的最長成員的長度。
聯(lián)合的初始化