當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 結(jié)構(gòu)體
結(jié)構(gòu)體的概念
結(jié)構(gòu)體屬于C數(shù)據(jù)類型中的構(gòu)造數(shù)據(jù)類型(Composite Data Types),在結(jié)構(gòu)體中可以包含若干個不同數(shù)據(jù)類型和不同意義的數(shù)據(jù)項,從而使這些數(shù)據(jù)項組合起來反映某一個信息,這些數(shù)據(jù)項稱為結(jié)構(gòu)體的成員(member)。
舉個例子:
上圖是模擬了一個圖書管理中的部分?jǐn)?shù)據(jù),可以很清楚的看到一本書有編號、書名、作者等許多信息。如果我想通過一個普通的數(shù)據(jù)類型來完整的描述這本書肯定是不現(xiàn)實的,而結(jié)構(gòu)體類型是集合了多種不同的數(shù)據(jù)類型,可以更加完全且方便的描述一本書,此時結(jié)構(gòu)體的每一個成員分別代表著書的不同的信息。
結(jié)構(gòu)體的聲明及結(jié)構(gòu)體變量的定義
標(biāo)準(zhǔn)形式:
這里struct為結(jié)構(gòu)體關(guān)鍵字,一般情況下,結(jié)構(gòu)體名、成員列表和結(jié)構(gòu)體變量名列表這三部分至少要出現(xiàn)2個,以示例解釋:
1.
2.
3.
4.完全形式
5.也可以通過typedef將結(jié)構(gòu)體重新定義
結(jié)構(gòu)體變量的使用方法
結(jié)構(gòu)體變量在使用的過程中應(yīng)該注意以下幾點:
1. 不能將一個結(jié)構(gòu)體類型變量作為一個整體加以引用,而只能對結(jié)構(gòu)體類型變量中的各個成員分別引用。
2. 使用成員運算符”.”修改和引用成員。
3. 相同結(jié)構(gòu)體類型的變量可以相互賦值。
輸出結(jié)果:
結(jié)構(gòu)體數(shù)組的使用方法
結(jié)構(gòu)體數(shù)組的使用方法就是普通類型數(shù)組的使用方式與結(jié)構(gòu)體變量的使用方式相結(jié)合,沒有難度,直接上代碼:
輸出結(jié)果:
結(jié)構(gòu)體指針的使用方法
結(jié)構(gòu)體指針也可以直接引用結(jié)構(gòu)體內(nèi)的成員,但是格式與變量引用不同,不用”.”而是用”->”引用。
輸出結(jié)果:
結(jié)構(gòu)體內(nèi)的偏移規(guī)則
1.每個成員的偏移量都必須是當(dāng)前成員所占內(nèi)存大小的整數(shù)倍如果不是編譯器會在成員之間加上填充字節(jié)。
2.當(dāng)所有成員大小計算完畢后,編譯器判斷當(dāng)前結(jié)構(gòu)體大小是否是結(jié)構(gòu)體中最寬的成員變量大小的整數(shù)倍,如果不是會在最后一個成員后做字節(jié)填充。
結(jié)構(gòu)體的大小計算
結(jié)構(gòu)體中有一個long類型,兩個char類型,兩個int類型成員,一個short類型成員,如果只按照這幾個成員大小相加,結(jié)構(gòu)體大小應(yīng)該是 4*3+1*2+2=16 個字節(jié)大小。但實際輸出結(jié)果是20個字節(jié)大小。
下面來一步步分析編譯器是如何計算大小進(jìn)行分配的。
1、遇到第一個成員變量a,該成員偏移量為0,大小為4,符合偏移規(guī)則第一條。
2、接下來第二個成員變量b,偏移量為4,大小為1,符合偏移規(guī)則第一條。
3、成員變量c,偏移量為5,大小為4,不符合偏移規(guī)則第一條。在成員b和c之間填充三個字節(jié),此時,偏移量大小為8,符合偏移規(guī)則第一條,繼續(xù)往下。
4、成員變量d,偏移量為12,大小為4,符合偏移規(guī)則第一條,繼續(xù)往下。
5、成員變量e,偏移量為16,大小為1,符合偏移規(guī)則第一條。
6、成員變量f,偏移量為17,大小為2,不符合偏移規(guī)則第一條,在成員e和f之間填充1個字節(jié),此時,偏移量大小為18,最終大小20個字節(jié)