第九章結(jié)構(gòu)體、共用體
與枚舉類(lèi)型張樂(lè)樂(lè)C語(yǔ)言程序設(shè)計(jì)19.1.1結(jié)構(gòu)體類(lèi)型的定義
struct
結(jié)構(gòu)體名
{
數(shù)據(jù)類(lèi)型1成員名1;
數(shù)據(jù)類(lèi)型2成員名2;……
數(shù)據(jù)類(lèi)型n成員名n;
};/*此行的分號(hào)不能少*/結(jié)構(gòu)體類(lèi)型定義的一般形式:
struct為關(guān)鍵字;結(jié)構(gòu)體名是用戶(hù)定義的類(lèi)型標(biāo)識(shí)。{}中是組成該結(jié)構(gòu)體的成員。成員的數(shù)據(jù)類(lèi)型可以是C語(yǔ)言所允許的任何數(shù)據(jù)類(lèi)型。29.1.1結(jié)構(gòu)體類(lèi)型的定義
structstudent {
longnum; charname[20]; charsex; intage; floatscore; charaddr[30]; };[例9.1]:定義學(xué)生檔案信息結(jié)構(gòu)類(lèi)型:成員表列
struct是類(lèi)型關(guān)鍵字后分號(hào)不能少,表明語(yǔ)句結(jié)束。結(jié)構(gòu)體名39.1.1結(jié)構(gòu)體類(lèi)型的定義
2.結(jié)構(gòu)體類(lèi)型特點(diǎn):
(1)結(jié)構(gòu)體類(lèi)型由多個(gè)成員組成,成員的數(shù)據(jù)類(lèi)型可以是整型、實(shí)型、字符型、數(shù)組
,也允許是另一個(gè)已經(jīng)定義的結(jié)構(gòu)體類(lèi)型。
(2)結(jié)構(gòu)體類(lèi)型系統(tǒng)沒(méi)有預(yù)先定義,凡需要使用結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的,都必須在程序中自己定義??筛鶕?jù)設(shè)計(jì)者的需要來(lái)組合的。
(3)定義一個(gè)結(jié)構(gòu)體類(lèi)型,系統(tǒng)不會(huì)為其分配內(nèi)存單元。定義一個(gè)類(lèi)型只是表示這個(gè)類(lèi)型的結(jié)構(gòu),即告訴系統(tǒng)它由哪些類(lèi)型的成員構(gòu)成,各占多少個(gè)字節(jié),各按什么形式存儲(chǔ),并把它們當(dāng)作一個(gè)整體來(lái)處理。49.1.2結(jié)構(gòu)體變量
----(1)先定義結(jié)構(gòu)體類(lèi)型再定義變量名語(yǔ)法格式:struct結(jié)構(gòu)體名
變量名表;例如:
structdatedate1;structstudents,t1,t2;按照結(jié)構(gòu)體類(lèi)型的組成,系統(tǒng)為定義的結(jié)構(gòu)體變量分配內(nèi)存單元。結(jié)構(gòu)體變量的各個(gè)成員在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域,結(jié)構(gòu)體變量所占內(nèi)存大小為結(jié)構(gòu)體中每個(gè)成員所占用內(nèi)存的長(zhǎng)度之和。structstudentnum4個(gè)字節(jié)name20個(gè)字節(jié)sex1個(gè)字節(jié)age2個(gè)字節(jié)addr30個(gè)字節(jié)score4個(gè)字節(jié)59.1.2結(jié)構(gòu)體變量
----(2)
在定義類(lèi)型的同時(shí)定義變量語(yǔ)法格式:例如:
structstudent
{charnum[8],name[20],sex;intage;floatscore;
}st1,st2;
struct結(jié)構(gòu)體名
{
成員定義表;
}變量名表;69.1.2結(jié)構(gòu)體變量
----(3)直接定義結(jié)構(gòu)類(lèi)型變量語(yǔ)法格式:
例如:
struct{charnum[8],name[20],sex;intage;floatscore;
}a,b,c;
struct{
成員定義表;
}變量名表;在struct后不出現(xiàn)結(jié)構(gòu)體名,因此也不能再以此定義相同的結(jié)構(gòu)體變量。79.1.3結(jié)構(gòu)體變量的引用對(duì)于結(jié)構(gòu)體變量,要通過(guò)成員運(yùn)算符“.”,逐個(gè)訪(fǎng)問(wèn)其成員,訪(fǎng)問(wèn)的格式為:
結(jié)構(gòu)變量名.成員
例如,structstudentst1,st2;st1.num,
引用結(jié)構(gòu)變量st1中的num成員;引用結(jié)構(gòu)變量st1中的name成員,引用結(jié)構(gòu)變量st2中的name成員,也可以引用結(jié)構(gòu)體變量以及變量成員的地址例如,&st1&其中的“.”是成員運(yùn)算符89.1.3結(jié)構(gòu)體變量的引用如果某成員本身又是一個(gè)結(jié)構(gòu)類(lèi)型,則只能通過(guò)多級(jí)的分量運(yùn)算,對(duì)最低一級(jí)的成員進(jìn)行引用。此時(shí)的引用格式擴(kuò)展為:
結(jié)構(gòu)變量名.成員.子成員.….最低一級(jí)子成員例如,引用結(jié)構(gòu)變量st1中的birthday成員的格式分別為:st1.birthday.yearst1.birthday.monthst1.birthday.day99.1.4結(jié)構(gòu)體變量的初始化【例】結(jié)構(gòu)體變量的初始化
structdate{intyear,month,day;};
structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={“0406011","Liming",'M',{1977,12,9},83},b={“0408025","Zhangliming",'F',{1978,5,10},87},c;
如果初值個(gè)數(shù)少于結(jié)構(gòu)體成員個(gè)數(shù),則將無(wú)初值對(duì)應(yīng)的成員賦以0值。
如果初值個(gè)數(shù)多于結(jié)構(gòu)體成員個(gè)數(shù),則編譯出錯(cuò)。109.5共用體結(jié)構(gòu)體類(lèi)型解決了如何描述一個(gè)邏輯上相關(guān),但數(shù)據(jù)類(lèi)型不同的一組分量的集合。在需要節(jié)省內(nèi)存儲(chǔ)空間時(shí),c語(yǔ)言還提供了一種由若干個(gè)不同類(lèi)型的數(shù)據(jù)項(xiàng)組成,但共享同一存儲(chǔ)空間的構(gòu)造類(lèi)型。共用體——一種構(gòu)造類(lèi)型數(shù)據(jù)
共用體由若干不同類(lèi)型的數(shù)據(jù)項(xiàng)(變量)占用同一段內(nèi)存空間的結(jié)構(gòu),構(gòu)成共用體的各個(gè)數(shù)據(jù)項(xiàng)稱(chēng)為共用體成員。由于共享的特性,只有最新存儲(chǔ)的數(shù)據(jù)是有效的。119.5共用體
union共用體名
{數(shù)據(jù)類(lèi)型1成員名1;
數(shù)據(jù)類(lèi)型2成員名2;……
數(shù)據(jù)類(lèi)型n成員名n;
};共用體類(lèi)型定義的一般形式:
union為關(guān)鍵字;共用體名是用戶(hù)定義的類(lèi)型標(biāo)識(shí)。{}中是組成該共用體的成員。成員的數(shù)據(jù)類(lèi)型可以是C語(yǔ)言所允許的任何數(shù)據(jù)類(lèi)型。129.5共用體
----①變量的定義u1變量chu1變量iu1變量f一.利用已定義的共用體類(lèi)型名定義變量
union共用體名
變量名表;例如:
unionutype
u1,u2;
按照共用體類(lèi)型的組成,系統(tǒng)為定義的共用體變量分配內(nèi)存單元。共用體變量所占內(nèi)存大小等于共用體中占用內(nèi)存的長(zhǎng)度最長(zhǎng)的成員。u1變量cc[0]c[1]c[2]c[3]139.5共用體
----①變量的定義二.在定義共用體類(lèi)型的同時(shí)定義變量例如:
unionutype{
inti;charch;floatf;charc[4];}a,b,c;
union共用體名
{
成員定義表;
}變量名表;149.5共用體
----①變量的定義三.直接定義共用體類(lèi)型變量
例如:
union
{
inti;charch;floatf;charc[4];}a,b,c;
union{
成員定義表;
}變量名表;159.5共用體
----②變量的引用與結(jié)構(gòu)變量一樣只能逐個(gè)引用共用變量的成員
scanf(“%d”,&a);printf(“%d”,a);訪(fǎng)問(wèn)變量a各成員的格式為:a.i、a.ch、a.f等
scanf(“%d”,&a.i);printf(“%d\n”,a.i);錯(cuò)誤錯(cuò)誤16結(jié)構(gòu)體與共用體的對(duì)比結(jié)構(gòu)體與共用體的主要區(qū)別:
(1)結(jié)構(gòu)體變量
占用空間是各成員所占空間之總和;
共用體變量
占存儲(chǔ)空間是各成員中所占空間最大者。(2)結(jié)構(gòu)體變量各成員占用內(nèi)存中一片連續(xù)的存儲(chǔ)區(qū),各成員的地址互不相同;共用體變量各成員在內(nèi)存中所占空間的起始地址相同。(3)結(jié)構(gòu)體變量的各個(gè)分量在任何時(shí)刻都同時(shí)存在,且可同時(shí)引用。共用體變量的各個(gè)分量在同一時(shí)刻只存在其中一個(gè),也只能引用其中的一個(gè)。
(4)結(jié)構(gòu)體變量可以初始化,共用體變量不能初始化。179.7用戶(hù)自定義類(lèi)型為類(lèi)型名定義別名的一般形式:
typedef類(lèi)型名新類(lèi)型名或
typedef
類(lèi)型定義新類(lèi)型名除可直接使用C提供的標(biāo)準(zhǔn)類(lèi)型和構(gòu)造類(lèi)型(結(jié)構(gòu)、共用、枚舉)外,也可使用typedef定義已有類(lèi)型的別名。該別名與標(biāo)準(zhǔn)類(lèi)型名一樣,可用來(lái)定義相應(yīng)的變量。typedef是關(guān)鍵字;類(lèi)型名可以是基本類(lèi)型、構(gòu)造類(lèi)型、指針類(lèi)型或自定義類(lèi)型名;
新類(lèi)型名是自定義的類(lèi)型名。189.7用戶(hù)自定義類(lèi)型typedefintINTEGRER;/*定義INTEGRER為整型類(lèi)型的別名*
評(píng)論
0/150
提交評(píng)論