結構體(ti)
時間(jian):2018-04-16 來源:未(wei)知
結構體的概念
結構(gou)(gou)體(ti)屬于(yu)C數(shu)(shu)據類(lei)型(xing)中的(de)構(gou)(gou)造數(shu)(shu)據類(lei)型(xing)(Composite Data Types),在結構(gou)(gou)體(ti)中可以包(bao)含若干個(ge)不同(tong)數(shu)(shu)據類(lei)型(xing)和(he)不同(tong)意義的(de)數(shu)(shu)據項(xiang),從而使這(zhe)些(xie)數(shu)(shu)據項(xiang)組(zu)合(he)起來反映某一個(ge)信息,這(zhe)些(xie)數(shu)(shu)據項(xiang)稱為(wei)結構(gou)(gou)體(ti)的(de)成員(member)。
舉個例子:

上(shang)圖是(shi)模(mo)擬了(le)一(yi)個(ge)(ge)圖書(shu)管(guan)理(li)中的(de)部(bu)分(fen)數(shu)據(ju)(ju),可以(yi)很清楚(chu)的(de)看到一(yi)本書(shu)有編號、書(shu)名、作者(zhe)等許多信(xin)息。如果我想通過一(yi)個(ge)(ge)普通的(de)數(shu)據(ju)(ju)類(lei)(lei)型來完整的(de)描(miao)述這(zhe)本書(shu)肯定是(shi)不(bu)現實的(de),而結構體類(lei)(lei)型是(shi)集合(he)了(le)多種(zhong)不(bu)同(tong)的(de)數(shu)據(ju)(ju)類(lei)(lei)型,可以(yi)更加完全且方便的(de)描(miao)述一(yi)本書(shu),此時結構體的(de)每(mei)一(yi)個(ge)(ge)成員分(fen)別代(dai)表著(zhu)書(shu)的(de)不(bu)同(tong)的(de)信(xin)息。
結構體(ti)的聲明(ming)及結構體(ti)變量的定義(yi)
標準形式:

這里struct為結構(gou)體(ti)關鍵字,一般情況下,結構(gou)體(ti)名(ming)(ming)、成員列表(biao)和結構(gou)體(ti)變量名(ming)(ming)列表(biao)這三部分至少要出現2個(ge),以示例解釋:
1.

2.

3.

4.完全形式

5.也可(ke)以通過typedef將結構體重新(xin)定(ding)義(yi)

結構體(ti)變量的使(shi)用方(fang)法(fa)
結構體變量(liang)在(zai)使用的(de)過程中應該注意以下幾點:
1. 不能將一(yi)(yi)個(ge)結構(gou)體類型變量(liang)作為一(yi)(yi)個(ge)整體加以引用(yong),而只能對(dui)結構(gou)體類型變量(liang)中的各(ge)個(ge)成員(yuan)分別引用(yong)。
2. 使用(yong)成(cheng)員運算符(fu)”.”修改和引(yin)用(yong)成(cheng)員。
3. 相同結構體類型的變量可(ke)以相互(hu)賦值。

輸出結果:

結構(gou)體數組的使(shi)用(yong)方法(fa)
結(jie)構體數組的(de)使(shi)用(yong)方法就是(shi)普通類型數組的(de)使(shi)用(yong)方式與結(jie)構體變量的(de)使(shi)用(yong)方式相結(jie)合,沒有難度,直接上代碼:

輸出結果:

結構體指針(zhen)的(de)使用方法
結(jie)(jie)構(gou)體(ti)指(zhi)針也可(ke)以直接(jie)引(yin)用(yong)結(jie)(jie)構(gou)體(ti)內的成員,但(dan)是(shi)格(ge)式與變量引(yin)用(yong)不同,不用(yong)”.”而是(shi)用(yong)”->”引(yin)用(yong)。

輸出結果:

結構體內的偏(pian)移規則
1.每(mei)個成員(yuan)的偏(pian)移量都必須是當前成員(yuan)所占內存大小(xiao)的整(zheng)數倍如果(guo)不是編譯器會(hui)在成員(yuan)之間(jian)加上填充字節。
2.當所(suo)有(you)成員大小(xiao)計算完(wan)畢后(hou),編譯器判斷當前結構體大小(xiao)是否(fou)是結構體中最寬(kuan)的(de)成員變(bian)量大小(xiao)的(de)整數(shu)倍,如果(guo)不是會在最后(hou)一個(ge)成員后(hou)做字節填充。
結構體(ti)的大小計(ji)算

結構(gou)體中有一(yi)個(ge)(ge)long類型(xing)(xing),兩(liang)個(ge)(ge)char類型(xing)(xing),兩(liang)個(ge)(ge)int類型(xing)(xing)成員,一(yi)個(ge)(ge)short類型(xing)(xing)成員,如果只(zhi)按照(zhao)這幾個(ge)(ge)成員大小相加,結構(gou)體大小應該(gai)是 4*3+1*2+2=16 個(ge)(ge)字(zi)節大小。但(dan)實際輸出結果是20個(ge)(ge)字(zi)節大小。
下面來一步(bu)步(bu)分(fen)析(xi)編(bian)譯器是如(ru)何計算(suan)大(da)小(xiao)進(jin)行分(fen)配的。
1、遇到第一(yi)個成員變量a,該成員偏(pian)移量為(wei)0,大小為(wei)4,符合偏(pian)移規則第一(yi)條。
2、接(jie)下來第(di)二(er)個成員變(bian)量b,偏(pian)移量為4,大小(xiao)為1,符合(he)偏(pian)移規則第(di)一條(tiao)。
3、成(cheng)員變量(liang)(liang)c,偏(pian)(pian)(pian)移(yi)量(liang)(liang)為(wei)5,大小為(wei)4,不符合(he)偏(pian)(pian)(pian)移(yi)規則第(di)一條。在成(cheng)員b和c之間(jian)填充三(san)個字(zi)節,此時,偏(pian)(pian)(pian)移(yi)量(liang)(liang)大小為(wei)8,符合(he)偏(pian)(pian)(pian)移(yi)規則第(di)一條,繼續往下(xia)。
4、成員變量d,偏移(yi)量為(wei)12,大(da)小為(wei)4,符合偏移(yi)規則第一條,繼續往(wang)下(xia)。
5、成員變量(liang)e,偏移量(liang)為(wei)16,大小為(wei)1,符合偏移規則第一條。
6、成員變量(liang)f,偏移量(liang)為(wei)17,大(da)小(xiao)為(wei)2,不(bu)符合偏移規(gui)則第(di)一條(tiao),在成員e和(he)f之間(jian)填充1個字(zi)節,此時,偏移量(liang)大(da)小(xiao)為(wei)18,最(zui)終大(da)小(xiao)20個字(zi)節

