版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章用戶自定義數(shù)據(jù)類型主要內(nèi)容主要內(nèi)容 9.1 定義和運(yùn)用構(gòu)造體變量定義和運(yùn)用構(gòu)造體變量 現(xiàn)實(shí)生活中存在這樣的數(shù)據(jù)現(xiàn)實(shí)生活中存在這樣的數(shù)據(jù)學(xué)號(hào)學(xué)號(hào)姓名姓名性別性別年齡年齡所在系所在系專業(yè)專業(yè)1001劉福劉福男男18丈量系丈量系工程丈量工程丈量學(xué)生信息學(xué)生信息點(diǎn)號(hào)點(diǎn)號(hào)X坐標(biāo)坐標(biāo)Y坐標(biāo)坐標(biāo)H氮肥廠氮肥廠2503396.5128709934.8769532.743丈量坐標(biāo)表丈量坐標(biāo)表 9.1.1 本人建立構(gòu)造體類型本人建立構(gòu)造體類型 C言語允許用戶本人建立由不同類型數(shù)據(jù)組成的結(jié)合言語允許用戶本人建立由不同類型數(shù)據(jù)組成的結(jié)合型的數(shù)據(jù)構(gòu)造,稱為型的數(shù)據(jù)構(gòu)造,稱為“構(gòu)造體構(gòu)造體 structre。構(gòu)造體
2、。構(gòu)造體中包含的數(shù)據(jù)元素稱為成員。中包含的數(shù)據(jù)元素稱為成員。定義一個(gè)構(gòu)造體類型的普通方式為:定義一個(gè)構(gòu)造體類型的普通方式為:struct 構(gòu)造體名構(gòu)造體名類型闡明符類型闡明符1 成員名成員名1;. . .類型闡明符類型闡明符n 成員名成員名n; ;每個(gè)成員都是該構(gòu)造體類型的一個(gè)組成部分,每個(gè)成每個(gè)成員都是該構(gòu)造體類型的一個(gè)組成部分,每個(gè)成員可以是一個(gè)根本數(shù)據(jù)類型,也可以是一個(gè)構(gòu)造類型員可以是一個(gè)根本數(shù)據(jù)類型,也可以是一個(gè)構(gòu)造類型。成員名的命名應(yīng)符合標(biāo)識(shí)符的書寫規(guī)范。成員名的命名應(yīng)符合標(biāo)識(shí)符的書寫規(guī)范。構(gòu)造體名是由用戶指定的,又稱構(gòu)造體名是由用戶指定的,又稱“構(gòu)造體標(biāo)志,以構(gòu)造體標(biāo)志,以區(qū)別于其
3、他的構(gòu)造體類型。區(qū)別于其他的構(gòu)造體類型。struct coordinate char pointname20; /*點(diǎn)名為字符串點(diǎn)名為字符串*/ double x; /*x坐標(biāo)為雙精度坐標(biāo)為雙精度*/ double y; /*y坐標(biāo)為雙精度坐標(biāo)為雙精度*/ double H; /*高程高程H為雙精度為雙精度*/ ; /*留意最后有一個(gè)分號(hào)留意最后有一個(gè)分號(hào)*/struct student int num; /*學(xué)號(hào)為整型學(xué)號(hào)為整型*/ char name15; /*姓名為字符串姓名為字符串*/ char sex; /*性別為字符性別為字符*/ int age; /*年齡為整型年齡為整型*/ c
4、har department 20; /*系別為字符串系別為字符串*/ char speciality20; /*專業(yè)為字符串專業(yè)為字符串*/ ; /*留意最后有一個(gè)分號(hào)留意最后有一個(gè)分號(hào)*/闡明:闡明:構(gòu)造體變量的成員可以是另一個(gè)構(gòu)造體變量。例如:構(gòu)造體變量的成員可以是另一個(gè)構(gòu)造體變量。例如:struct date /*聲明一個(gè)構(gòu)造體類型聲明一個(gè)構(gòu)造體類型struct date*/ int moth; /*月月*/ int day; /*日日*/ int year; /*年年*/; struct student int num; char name15; char sex; struct d
5、ate birthday; /*struct data類型類型*/ char department 20; char speciality20; ; 9.1.1 本人建立構(gòu)造體類型本人建立構(gòu)造體類型 9.1.2 定義構(gòu)造體類型變量定義構(gòu)造體類型變量 構(gòu)造體類型一旦定義,它相當(dāng)于一個(gè)模型,并沒有定義構(gòu)造體類型一旦定義,它相當(dāng)于一個(gè)模型,并沒有定義變量,其中并無詳細(xì)數(shù)據(jù),系統(tǒng)對(duì)它也不分配實(shí)踐的內(nèi)變量,其中并無詳細(xì)數(shù)據(jù),系統(tǒng)對(duì)它也不分配實(shí)踐的內(nèi)存單元,相當(dāng)于設(shè)計(jì)好了圖紙,但并未建成詳細(xì)的房屋。存單元,相當(dāng)于設(shè)計(jì)好了圖紙,但并未建成詳細(xì)的房屋。為了能在程序中運(yùn)用構(gòu)造體類型的數(shù)據(jù),該當(dāng)定義構(gòu)造為了能在程
6、序中運(yùn)用構(gòu)造體類型的數(shù)據(jù),該當(dāng)定義構(gòu)造體類型的變量,并在其中存放詳細(xì)的數(shù)據(jù)??梢圆捎皿w類型的變量,并在其中存放詳細(xì)的數(shù)據(jù)??梢圆捎?3種方法定義構(gòu)造體類型變量。種方法定義構(gòu)造體類型變量。 9.1.2 定義構(gòu)造體類型變量定義構(gòu)造體類型變量 struct student long no; char name15; char sex; int age; float score; ; struct student stu1,stu2;構(gòu)造體類型名構(gòu)造體類型名構(gòu)造體變量名構(gòu)造體變量名struct coordinate char pointname20; double x; double y; doubl
7、e H; ; struct coordinate pt1,pt2;構(gòu)造體類型名構(gòu)造體類型名構(gòu)造體變量名構(gòu)造體變量名 9.1.2 定義構(gòu)造體類型變量定義構(gòu)造體類型變量struct student long no; char name15; char sex; int age; float score; stu1,stu2; struct coordinate char pointname20; double x; double y; double H; pt1,pt2; 9.1.2 定義構(gòu)造體類型變量定義構(gòu)造體類型變量struct long no; char name15; char sex;
8、int age; float score; stu1,stu2; struct char pointname20; double x; double y; double H; pt1,pt2; 這種方式指定了一個(gè)無名的構(gòu)造體類型,它沒有名字這種方式指定了一個(gè)無名的構(gòu)造體類型,它沒有名字不出現(xiàn)構(gòu)造體名。顯然不能再以此構(gòu)造體類型去不出現(xiàn)構(gòu)造體名。顯然不能再以此構(gòu)造體類型去定義其他變量。這種方式用得不多。定義其他變量。這種方式用得不多。1構(gòu)造體類型與構(gòu)造體變量是不同的概念,不要構(gòu)造體類型與構(gòu)造體變量是不同的概念,不要混淆。只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一混淆。只能對(duì)變量賦值、存取或運(yùn)算,而不能
9、對(duì)一個(gè)類型賦值、存取或運(yùn)算。在編譯時(shí),對(duì)類型是不個(gè)類型賦值、存取或運(yùn)算。在編譯時(shí),對(duì)類型是不分配空間的,只對(duì)變量分配空間。分配空間的,只對(duì)變量分配空間。2構(gòu)造體類型中的成員名可以與程序中的變量名構(gòu)造體類型中的成員名可以與程序中的變量名一樣,但二者不代表同一對(duì)象。一樣,但二者不代表同一對(duì)象。3對(duì)構(gòu)造體變量中的成員即對(duì)構(gòu)造體變量中的成員即“域,可以單域,可以單獨(dú)運(yùn)用,它的作用相當(dāng)于普通變量。獨(dú)運(yùn)用,它的作用相當(dāng)于普通變量。關(guān)于構(gòu)造體類型的幾點(diǎn)闡明:關(guān)于構(gòu)造體類型的幾點(diǎn)闡明: 9.1.2 定義構(gòu)造體類型變量定義構(gòu)造體類型變量9.1.3 構(gòu)造體的初始化和援用構(gòu)造體的初始化和援用在定義構(gòu)造體變量時(shí),可以
10、對(duì)它初始化,即賦予初在定義構(gòu)造體變量時(shí),可以對(duì)它初始化,即賦予初始值,然后可以援用這個(gè)變量。始值,然后可以援用這個(gè)變量?!纠纠?-1】把一個(gè)坐標(biāo)點(diǎn)的信息放在一個(gè)構(gòu)造體變量中,】把一個(gè)坐標(biāo)點(diǎn)的信息放在一個(gè)構(gòu)造體變量中,然后輸出這個(gè)點(diǎn)的信息。然后輸出這個(gè)點(diǎn)的信息。解題思緒:解題思緒:先在程序中建立一個(gè)構(gòu)造體類型,包括坐標(biāo)點(diǎn)的各成員,先在程序中建立一個(gè)構(gòu)造體類型,包括坐標(biāo)點(diǎn)的各成員,然后用它定義構(gòu)造體變量,同時(shí)賦以初值一個(gè)點(diǎn)的信然后用它定義構(gòu)造體變量,同時(shí)賦以初值一個(gè)點(diǎn)的信息,最后輸出該構(gòu)造體變量的各成員即點(diǎn)的信息。息,最后輸出該構(gòu)造體變量的各成員即點(diǎn)的信息。#includevoid main()
11、 struct coordinate char pointname20; /*點(diǎn)名為字符串點(diǎn)名為字符串*/ double x; /*x坐標(biāo)為雙精度坐標(biāo)為雙精度*/ double y; /*y坐標(biāo)為雙精度坐標(biāo)為雙精度*/ double H; /*高程高程H為雙精度為雙精度*/ pt1=氮肥廠氮肥廠,2503396.5128,709934.8769,532.743 ; printf(點(diǎn)名點(diǎn)名:%snx坐標(biāo)坐標(biāo):%.4fny坐標(biāo)坐標(biāo):%.4fn高程高程:%.3fn,pt1.pointname,pt1.x,pt1.y,pt1.H);9.1.3 構(gòu)造體的初始化和援用構(gòu)造體的初始化和援用援用構(gòu)造體變量應(yīng)遵
12、守以下規(guī)那么:援用構(gòu)造體變量應(yīng)遵守以下規(guī)那么:1可以援用構(gòu)造體變量中成員的值,援用方式為可以援用構(gòu)造體變量中成員的值,援用方式為構(gòu)造體變量名構(gòu)造體變量名.成員名成員名如在程序中可以對(duì)變量的成員賦值如在程序中可以對(duì)變量的成員賦值pt1.H=576.237;“.是成員運(yùn)算符,它在一切的運(yùn)算符中優(yōu)先級(jí)最高,是成員運(yùn)算符,它在一切的運(yùn)算符中優(yōu)先級(jí)最高,因此可以把因此可以把pt1.H作為一個(gè)整體來對(duì)待。作為一個(gè)整體來對(duì)待。留意:不能經(jīng)過構(gòu)造體變量名來得到構(gòu)造體變量中所留意:不能經(jīng)過構(gòu)造體變量名來得到構(gòu)造體變量中所有成員的值。有成員的值。printf(“%sn,pt1);/*企圖用構(gòu)造體變量名輸出一切成員
13、的值企圖用構(gòu)造體變量名輸出一切成員的值*/只能對(duì)構(gòu)造體變量中的各個(gè)成員分別進(jìn)展輸入和輸出。只能對(duì)構(gòu)造體變量中的各個(gè)成員分別進(jìn)展輸入和輸出。9.1.3 構(gòu)造體的初始化和援用構(gòu)造體的初始化和援用援用構(gòu)造體變量應(yīng)遵守以下規(guī)那么:援用構(gòu)造體變量應(yīng)遵守以下規(guī)那么:2假設(shè)成員本身又屬于一個(gè)構(gòu)造體類型,那么要用假設(shè)成員本身又屬于一個(gè)構(gòu)造體類型,那么要用多個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低一級(jí)的成員。多個(gè)成員運(yùn)算符,一級(jí)一級(jí)地找到最低一級(jí)的成員。只能對(duì)最低級(jí)的成員進(jìn)展賦值或存取以及運(yùn)算。只能對(duì)最低級(jí)的成員進(jìn)展賦值或存取以及運(yùn)算。如援用成員的方式為:如援用成員的方式為:student1.no構(gòu)造體變量構(gòu)造體變量s
14、tudent1的成員的成員nostudent1.birthday.month構(gòu)造體變量構(gòu)造體變量student1中的中的成員成員birthday中的成員中的成員month9.1.3 構(gòu)造體的初始化和援用構(gòu)造體的初始化和援用援用構(gòu)造體變量應(yīng)遵守以下規(guī)那么:援用構(gòu)造體變量應(yīng)遵守以下規(guī)那么:3對(duì)構(gòu)造體變量的成員可以像普通變量一樣進(jìn)展對(duì)構(gòu)造體變量的成員可以像普通變量一樣進(jìn)展各種運(yùn)算根據(jù)其類型決議可以進(jìn)展的運(yùn)算。各種運(yùn)算根據(jù)其類型決議可以進(jìn)展的運(yùn)算。如:如:pt1.H=pt1.H+1.5賦值運(yùn)算賦值運(yùn)算HAB=ptB.H-ptA.H減法運(yùn)算減法運(yùn)算4同類的構(gòu)造體變量可以相互賦值,如:同類的構(gòu)造體變量可以
15、相互賦值,如:pt1=pt2;9.1.3 構(gòu)造體的初始化和援用構(gòu)造體的初始化和援用援用構(gòu)造體變量應(yīng)遵守以下規(guī)那么:援用構(gòu)造體變量應(yīng)遵守以下規(guī)那么:5可以援用構(gòu)造體變量成員的地址,也可以援用結(jié)可以援用構(gòu)造體變量成員的地址,也可以援用結(jié)構(gòu)體變量的地址。構(gòu)體變量的地址。scanf(“%f,&pt1.x); (輸入輸入pt1.x的值的值)printf(“%o,&pt1); (輸出構(gòu)造體變量輸出構(gòu)造體變量pt1的首地址的首地址)但不能用以下方式的語句整體讀入構(gòu)造體變量但不能用以下方式的語句整體讀入構(gòu)造體變量scanf(“%s,%f,%f,%f,&pt1);構(gòu)造體變量的地址主要用作函數(shù)參數(shù),經(jīng)過它來傳送構(gòu)
16、造體變量的地址主要用作函數(shù)參數(shù),經(jīng)過它來傳送構(gòu)造體變量的地址。構(gòu)造體變量的地址。9.1.3 構(gòu)造體的初始化和援用構(gòu)造體的初始化和援用【例【例9-2】輸入兩點(diǎn)的】輸入兩點(diǎn)的x坐標(biāo)、坐標(biāo)、y坐標(biāo)和高程,輸出兩點(diǎn)間坐標(biāo)和高程,輸出兩點(diǎn)間的間隔和高差的間隔和高差 。#include#includevoid main()struct coordinatechar name20;double x;double y;double H;pt1,pt2;double S,h;scanf(%s%lf%lf%lf,,&pt1.x,&pt1.y,&pt1.H);scanf(%s%lf%lf%lf,pt
17、2.name,&pt2.x,&pt2.y,&pt2.H);S=sqrt(pt2.x-pt1.x)*(pt2.x-pt1.x)+(pt2.y-pt1.y)*(pt2.y-pt1.y);h=pt2.H-pt1.H;printf(“%s-%s之間的間隔為之間的間隔為:%.4fm,高差為高差為:%.3fmn,,,S,h);【例【例9-3】 如以下圖為按圖根水準(zhǔn)丈量要求施測(cè)某閉合水如以下圖為按圖根水準(zhǔn)丈量要求施測(cè)某閉合水準(zhǔn)道路觀測(cè)成果略圖。準(zhǔn)道路觀測(cè)成果略圖。A點(diǎn)為知點(diǎn)高程,圖中箭頭表示水點(diǎn)為知點(diǎn)高程,圖中箭頭表示水準(zhǔn)丈量的前進(jìn)方向,試計(jì)算待定點(diǎn)準(zhǔn)丈量的前進(jìn)方向,試計(jì)算待
18、定點(diǎn)B、C、D點(diǎn)的高程。點(diǎn)的高程。9.2 構(gòu)造體數(shù)組構(gòu)造體數(shù)組計(jì)算閉合差計(jì)算閉合差判別閉合差能否超限判別閉合差能否超限計(jì)算各測(cè)段觀測(cè)高差的矯正數(shù)計(jì)算各測(cè)段觀測(cè)高差的矯正數(shù)計(jì)算各測(cè)段的矯正后的高差計(jì)算各測(cè)段的矯正后的高差計(jì)算各點(diǎn)的高程值計(jì)算各點(diǎn)的高程值檢查閉合差能否分配完檢查閉合差能否分配完容許hhff hfviihiihinnfLLfviiivhh21211hHHhHHA;閉合水準(zhǔn)道路成果計(jì)算閉合水準(zhǔn)道路成果計(jì)算測(cè)理測(cè)hhhfhBMA234 1 19.2 構(gòu)造體數(shù)組構(gòu)造體數(shù)組71.86410-2.5694-1.66382.313BM.ABM.A知點(diǎn)知點(diǎn)25.654BM.ABCD29-0.055
19、0.0130.0190.0080.0151.877-2.550-1.6552.328027.53124.98123.32625.654BCDBM.A0.055mmmmfh652912容mmmhfh55055. 0#include#includestruct CD /*CD代表測(cè)段的意思代表測(cè)段的意思*/char CDname10; /*測(cè)段名測(cè)段名*/char CZname; /*測(cè)點(diǎn)名測(cè)點(diǎn)名*/double CDZS; /*測(cè)段站數(shù)測(cè)段站數(shù)*/double CDh; /*測(cè)段高差測(cè)段高差*/double CDGZV; /*測(cè)段矯正數(shù)測(cè)段矯正數(shù)*/double CDGZh; /*測(cè)段矯正高差測(cè)
20、段矯正高差*/double H; /*H為測(cè)站高程為測(cè)站高程*/CDS4=AB,A,7,1.864,0.0,0.0,25.654,BC,B,10,-2.569,0.0,0.0,0.0,CD,C,4,-1.663,0.0,0.0,0.0,DA,D,8,2.313,0.0,0.0,0.0, ;void main()int i;double sumCDZS=0,sumCDh=0;/*sumCDZS為測(cè)站總數(shù),為測(cè)站總數(shù),sumCDh為高差之和為高差之和*/double f;/*f為允許誤差為允許誤差*/for(i=0;i4;i+)sumCDZS=sumCDZS+CDSi.CDZS; /*sumCDZ
21、S為測(cè)站總數(shù)為測(cè)站總數(shù)*/sumCDh=sumCDh+CDSi.CDh; /*sumCDh為高差之和為高差之和*/f=12*sqrt(sumCDZS)/1000;printf(nt=中間計(jì)算過程中間計(jì)算過程=nn);printf(tt測(cè)站總數(shù)為測(cè)站總數(shù)為%.f站站,測(cè)站高差之和為測(cè)站高差之和為%.3fmntt允許誤差允許誤差為為:%.3fm,sumCDZS,sumCDh,f);if(fabs(sumCDh)=f)printf(閉合差未超限閉合差未超限!n);for(i=0;i4;i+)CDSi.CDGZV=CDSi.CDZS/sumCDZS*sumCDh*(-1); CDSi.CDGZh=CD
22、Si.CDh+CDSi.CDGZV; printf(tt%c點(diǎn)高差矯正數(shù)為點(diǎn)高差矯正數(shù)為%.3fm,矯正后高差為矯正后高差為%.3fmn,CDSi.CZname,CDSi.CDGZV,CDSi.CDGZh);for(i=1;i4;i+)CDSi.H=CDSi-1.H+CDSi-1.CDGZh;/*計(jì)算各測(cè)站高程計(jì)算各測(cè)站高程*/printf(nt=計(jì)算結(jié)果計(jì)算結(jié)果=nn);for(i=0;i4;i+)printf(tttt%c點(diǎn)高程為點(diǎn)高程為:%.3fmn,CDSi.CZname,CDSi.H);elseprintf(tt閉合差超限閉合差超限!);printf(nt=n);闡明:闡明:1構(gòu)造體
23、數(shù)組可以在定義時(shí)初始化,但只構(gòu)造體數(shù)組可以在定義時(shí)初始化,但只能對(duì)全局的或靜態(tài)存儲(chǔ)的數(shù)組進(jìn)展初始化。能對(duì)全局的或靜態(tài)存儲(chǔ)的數(shù)組進(jìn)展初始化。2構(gòu)造體數(shù)組的援用類似于構(gòu)造體變量的構(gòu)造體數(shù)組的援用類似于構(gòu)造體變量的援用,只是用構(gòu)造體數(shù)組元素來替代構(gòu)造體變?cè)?,只是用?gòu)造體數(shù)組元素來替代構(gòu)造體變量。如第一個(gè)學(xué)生的個(gè)人信息:量。如第一個(gè)學(xué)生的個(gè)人信息:stu0.sexstu0.agestu0.scorestu0.address同構(gòu)造體變量一樣,構(gòu)造體數(shù)組元素不能整體同構(gòu)造體變量一樣,構(gòu)造體數(shù)組元素不能整體的輸入輸出,只能以單個(gè)成員為對(duì)象進(jìn)展輸入的輸入輸出,只能以單個(gè)成員為
24、對(duì)象進(jìn)展輸入輸出。輸出。 9.2 構(gòu)造體數(shù)組構(gòu)造體數(shù)組9.3 構(gòu)造體指針構(gòu)造體指針?biāo)^構(gòu)造體指針就是指向構(gòu)造體數(shù)據(jù)的指針,一個(gè)結(jié)所謂構(gòu)造體指針就是指向構(gòu)造體數(shù)據(jù)的指針,一個(gè)結(jié)構(gòu)體變量的起始地址就是這個(gè)構(gòu)造體變量的指針。如構(gòu)體變量的起始地址就是這個(gè)構(gòu)造體變量的指針。如果把一個(gè)構(gòu)造體變量的起始地址存放在一個(gè)指針變量果把一個(gè)構(gòu)造體變量的起始地址存放在一個(gè)指針變量中,那么,這個(gè)指針變量就指向該構(gòu)造體變量。指針中,那么,這個(gè)指針變量就指向該構(gòu)造體變量。指針變量既可以指向構(gòu)造體變量,也可以指向構(gòu)造體數(shù)組變量既可以指向構(gòu)造體變量,也可以指向構(gòu)造體數(shù)組中的元素。但是,指針變量的基類型必需與構(gòu)造體變中的元素。但
25、是,指針變量的基類型必需與構(gòu)造體變量的類型一樣。量的類型一樣?!纠纠?-4】經(jīng)過指向構(gòu)造體變量的指針變量輸出構(gòu)造體變】經(jīng)過指向構(gòu)造體變量的指針變量輸出構(gòu)造體變量中成員的信息。量中成員的信息。9.3 構(gòu)造體指針構(gòu)造體指針解題思緒:解題思緒:1對(duì)構(gòu)造體變量成員賦值;對(duì)構(gòu)造體變量成員賦值;2經(jīng)過指向構(gòu)造體變量的指針訪問構(gòu)造體變量中經(jīng)過指向構(gòu)造體變量的指針訪問構(gòu)造體變量中 的成員。的成員。#include#includevoid main()struct coordinatechar pointname20;double x;double y;double H;struct coordinate p
26、t1;struct coordinate *p;p=&pt1;strcpy(pt1.pointname,氮肥廠氮肥廠);pt1.x=2503396.5128;pt1.y=709934.8769;pt1.H=532.743;printf(點(diǎn)名點(diǎn)名:%snx坐標(biāo)坐標(biāo):%.4fny坐標(biāo)坐標(biāo):%.4fn高程高程%.3fn,pt1.pointname,pt1.x,pt1.y,pt1.H);printf(n點(diǎn)名點(diǎn)名:%snx坐標(biāo)坐標(biāo):%.4fny坐標(biāo)坐標(biāo):%.4fn高程高程%.3fn,(*p).pointname,(*p).x,(*p).y,(*p).H);闡明:闡明:(*p)表示表示p指向的構(gòu)造體變量,
27、指向的構(gòu)造體變量,(*p).x是是p指向的構(gòu)造體指向的構(gòu)造體變量中的成員變量中的成員x。留意,。留意,*p兩側(cè)的括號(hào)不可省,由于成兩側(cè)的括號(hào)不可省,由于成員運(yùn)算符員運(yùn)算符“.優(yōu)先于優(yōu)先于“*運(yùn)算符,運(yùn)算符,*p.x就等價(jià)于就等價(jià)于*p.x了。了。9.3 構(gòu)造體指針構(gòu)造體指針9.3 構(gòu)造體指針構(gòu)造體指針留意:留意:為了運(yùn)用方便和直觀,為了運(yùn)用方便和直觀,C言語允許把言語允許把(*p).x改用改用p-x來替代,它表示來替代,它表示p所所指向的構(gòu)造體變量中的所所指向的構(gòu)造體變量中的x成員。成員?!?稱為指向運(yùn)算符。稱為指向運(yùn)算符。假設(shè)假設(shè)p指向一個(gè)構(gòu)造體變量,以下指向一個(gè)構(gòu)造體變量,以下3種方式等價(jià)
28、:種方式等價(jià):1構(gòu)造體變量構(gòu)造體變量.成員名成員名2(*p).成員名成員名3p-成員名成員名指向構(gòu)造體變量的指針變量,也可以用來指向構(gòu)造指向構(gòu)造體變量的指針變量,也可以用來指向構(gòu)造體數(shù)組元素。體數(shù)組元素。8.3.1 數(shù)組元素的指針數(shù)組元素的指針【例【例9-5】有】有3個(gè)點(diǎn)坐標(biāo),放在構(gòu)造體數(shù)組中,要求輸出全個(gè)點(diǎn)坐標(biāo),放在構(gòu)造體數(shù)組中,要求輸出全部坐標(biāo)信息。部坐標(biāo)信息。解題思緒:解題思緒:1聲明構(gòu)造體類型聲明構(gòu)造體類型struct coordinate,并定義構(gòu)造體數(shù)組,同,并定義構(gòu)造體數(shù)組,同時(shí)使之初始化;時(shí)使之初始化;2定義一個(gè)指向定義一個(gè)指向struct coordinate類型數(shù)據(jù)的指針變
29、量;類型數(shù)據(jù)的指針變量;3使使p指向構(gòu)造體數(shù)組的首元素,輸出它指向的元素中的有關(guān)指向構(gòu)造體數(shù)組的首元素,輸出它指向的元素中的有關(guān)信息;信息;4利用循環(huán)使利用循環(huán)使p指向構(gòu)造體數(shù)組的下幾個(gè)元素并輸出它們的信指向構(gòu)造體數(shù)組的下幾個(gè)元素并輸出它們的信息。息。#includestruct coordinatechar pointname20;double x;double y;double H;struct coordinate pt3=氮肥廠氮肥廠,2503396.5128,709934.8769,532.743, 扶綏中學(xué)扶綏中學(xué),2505530.1986,710280.0416,543.112,
30、 渠黎中學(xué)渠黎中學(xué),2503369.2088,712593.9624,512.223;void main()struct coordinate *p;printf( 點(diǎn)名點(diǎn)名 x坐標(biāo)坐標(biāo) y坐標(biāo)坐標(biāo) Hn);for(p=pt;ppointname,p-x,p-y,p-H);pt1pt2512.223712593.96242503369.2088渠黎中學(xué)渠黎中學(xué)543.112710280.04162505530.1986扶綏中學(xué)扶綏中學(xué)532.743709934.87692503396.5128氮肥廠氮肥廠pt0pppp是指向是指向struct coordinate結(jié)結(jié)構(gòu)體類型數(shù)據(jù)的指針變量。構(gòu)
31、體類型數(shù)據(jù)的指針變量。在在for語句中先使語句中先使p的初值為的初值為pt,也就是數(shù)組,也就是數(shù)組pt第一個(gè)元第一個(gè)元素的起始地址,圖中素的起始地址,圖中 p的指的指向。在第一個(gè)循環(huán)中輸出向。在第一個(gè)循環(huán)中輸出 pt0的各個(gè)成員值,然后的各個(gè)成員值,然后p+,使使p自加自加1。P加加1意味著意味著 p所所添加的值為構(gòu)造體數(shù)組添加的值為構(gòu)造體數(shù)組pt的的一個(gè)元素所占的字節(jié)數(shù)在一個(gè)元素所占的字節(jié)數(shù)在VC+環(huán)境下環(huán)境下 ,本例一個(gè),本例一個(gè)元素所占的字節(jié)數(shù)為元素所占的字節(jié)數(shù)為20+8+8+8=44字節(jié)。執(zhí)行字節(jié)。執(zhí)行p+后,后,p的值等于的值等于pt+1,p指向指向pt1,見圖,見圖p的指向。的指向
32、。9.3 構(gòu)造體指針構(gòu)造體指針留意:留意:1假設(shè)假設(shè)p的初值為的初值為pt,即指向,即指向pt的第一個(gè)元素,的第一個(gè)元素,p加加1后,后,p就指向下一個(gè)元素。例如:就指向下一個(gè)元素。例如:+p-H 先使先使p自然加自然加1,然后得到,然后得到p指向的元素中指向的元素中x成員值成員值即即543.112p+-H 先求得先求得p-H的值即的值即532.743,然后再使,然后再使p自加自加1,指向,指向pt12程序已定義了程序已定義了p是一個(gè)指向是一個(gè)指向struct coordinate類型數(shù)據(jù)的類型數(shù)據(jù)的指針變量,它用來指向一個(gè)指針變量,它用來指向一個(gè)struct coordinate類型的數(shù)據(jù),
33、不類型的數(shù)據(jù),不運(yùn)用來指向運(yùn)用來指向pt數(shù)組中的某一成員。數(shù)組中的某一成員。假設(shè)要將某一成員的地址賦給假設(shè)要將某一成員的地址賦給p,可以用強(qiáng)迫類型轉(zhuǎn)換,先將,可以用強(qiáng)迫類型轉(zhuǎn)換,先將成員的地址轉(zhuǎn)換成成員的地址轉(zhuǎn)換成p的類型。例如的類型。例如p=struct coordinate*pt0.pointname;9.3 構(gòu)造體指針構(gòu)造體指針9.4 用構(gòu)造體變量和構(gòu)造體變量的指針作函數(shù)參數(shù)用構(gòu)造體變量和構(gòu)造體變量的指針作函數(shù)參數(shù)將一個(gè)構(gòu)造體變量的值傳送給另一個(gè)函數(shù),有將一個(gè)構(gòu)造體變量的值傳送給另一個(gè)函數(shù),有3種方法:種方法:1用構(gòu)造體變量的成員作參數(shù)。用構(gòu)造體變量的成員作參數(shù)。 其用法和普通變量作參數(shù)
34、其用法和普通變量作參數(shù)一樣,屬于一樣,屬于“值傳送方式。該當(dāng)留意實(shí)參與形參的類型堅(jiān)持值傳送方式。該當(dāng)留意實(shí)參與形參的類型堅(jiān)持一致。一致。2用構(gòu)造體變量作實(shí)參。用構(gòu)造體變量作實(shí)參。 用構(gòu)造體變量作實(shí)參時(shí),采用的用構(gòu)造體變量作實(shí)參時(shí),采用的也是也是“值傳送的方式,將構(gòu)造體變量所占的內(nèi)存單元的內(nèi)容值傳送的方式,將構(gòu)造體變量所占的內(nèi)存單元的內(nèi)容全部順序傳送給形參,形參也必需是同類型的構(gòu)造體變量。在全部順序傳送給形參,形參也必需是同類型的構(gòu)造體變量。在函數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種傳送方式在空間和函數(shù)調(diào)用期間形參也要占用內(nèi)存單元。這種傳送方式在空間和時(shí)間上開銷較大,假設(shè)構(gòu)造體規(guī)模很大時(shí),開銷是很
35、可觀的。時(shí)間上開銷較大,假設(shè)構(gòu)造體規(guī)模很大時(shí),開銷是很可觀的。此外由于采用值傳送方式,假設(shè)在執(zhí)行被調(diào)用函數(shù)期間改動(dòng)了此外由于采用值傳送方式,假設(shè)在執(zhí)行被調(diào)用函數(shù)期間改動(dòng)了形參也是構(gòu)造體變量的值,該值不能前往主調(diào)函數(shù),這往形參也是構(gòu)造體變量的值,該值不能前往主調(diào)函數(shù),這往往會(huì)呵斥運(yùn)用上的不便。因此較少運(yùn)用。往會(huì)呵斥運(yùn)用上的不便。因此較少運(yùn)用。9.4 用構(gòu)造體變量和構(gòu)造體變量的指針作函數(shù)參數(shù)用構(gòu)造體變量和構(gòu)造體變量的指針作函數(shù)參數(shù)3用指向構(gòu)造體變量或數(shù)組的指針作實(shí)參,用指向構(gòu)造體變量或數(shù)組的指針作實(shí)參,將構(gòu)造體變量或數(shù)組的地址傳送給形參。將構(gòu)造體變量或數(shù)組的地址傳送給形參。 8.3.2 經(jīng)過指針援
36、用數(shù)組元素經(jīng)過指針援用數(shù)組元素【例【例9-6】有】有N個(gè)構(gòu)造體變量個(gè)構(gòu)造體變量BC,內(nèi)含邊長(zhǎng)名,每條邊長(zhǎng),內(nèi)含邊長(zhǎng)名,每條邊長(zhǎng)的的3次觀測(cè)值,要求輸出平均邊長(zhǎng)最長(zhǎng)的邊長(zhǎng)信息包括次觀測(cè)值,要求輸出平均邊長(zhǎng)最長(zhǎng)的邊長(zhǎng)信息包括邊長(zhǎng)名、邊長(zhǎng)名、3次觀測(cè)值和平均邊長(zhǎng)。次觀測(cè)值和平均邊長(zhǎng)。解題思緒:解題思緒:1用用input函數(shù)來輸入數(shù)據(jù)和求平均邊長(zhǎng);函數(shù)來輸入數(shù)據(jù)和求平均邊長(zhǎng);2用用maxL函數(shù)來找平均邊長(zhǎng)最長(zhǎng)的邊長(zhǎng);函數(shù)來找平均邊長(zhǎng)最長(zhǎng)的邊長(zhǎng);3用用print函數(shù)來輸出邊長(zhǎng)最長(zhǎng)的邊長(zhǎng)信息。函數(shù)來輸出邊長(zhǎng)最長(zhǎng)的邊長(zhǎng)信息。#include#define N 3 /*觀測(cè)觀測(cè)3條邊長(zhǎng)條邊長(zhǎng)*/struct
37、length /*聲明構(gòu)造體類型聲明構(gòu)造體類型*/char name20; /*邊長(zhǎng)名邊長(zhǎng)名*/float L3; /*每條邊長(zhǎng)觀測(cè)每條邊長(zhǎng)觀測(cè)3次的數(shù)據(jù)次的數(shù)據(jù)*/float aver; /*平均邊長(zhǎng)平均邊長(zhǎng)*/;void main()void input(struct length BC); /*函數(shù)聲明函數(shù)聲明*/struct length maxL(struct length BC); /*函數(shù)聲明函數(shù)聲明*/void print(struct length BC); /*函數(shù)聲明函數(shù)聲明*/struct length BCN,*p=BC; /*定義構(gòu)造體數(shù)組和指針定義構(gòu)造體數(shù)組和指針
38、*/input(p); /*調(diào)用調(diào)用input函數(shù)函數(shù)*/print(maxL(p); /*調(diào)用調(diào)用print函數(shù)函數(shù),以以maxL函數(shù)的前往值作為函數(shù)的前往值作為實(shí)參實(shí)參*/void input(struct length BC)int i;printf(請(qǐng)輸入各條邊長(zhǎng)的信息:邊長(zhǎng)名、三次觀測(cè)請(qǐng)輸入各條邊長(zhǎng)的信息:邊長(zhǎng)名、三次觀測(cè)值:值:n);for(i=0;iN;i+)scanf(%s %f %f %f, BC,&BCi.L0,&BCi.L1,&BCi.L2);BCi.aver=(BCi.L0+BCi.L1+BCi.L2)/3.0;struct length maxL(stru
39、ct length BC)int i,m=0;for(i=0;iBCm.aver) m=i;return BCm;void print(struct length BC)printf(n邊長(zhǎng)最長(zhǎng)的是:邊長(zhǎng)最長(zhǎng)的是:n);printf(邊長(zhǎng)名邊長(zhǎng)名:%sn三次觀測(cè)值三次觀測(cè)值:%10.5f%10.5f%10.5fn平均平均邊長(zhǎng):邊長(zhǎng):%10.5fn,BC.name,BC.L0,BC.L1,BC.L2,BC.aver ); 9.5 共用體類型共用體類型共用體共用體unionunion是一種構(gòu)造類型是一種構(gòu)造類型, ,它很像構(gòu)造它很像構(gòu)造體類型,也是將不同類型的數(shù)據(jù)項(xiàng)組成一個(gè)整體類型,也是將不同類型的數(shù)據(jù)項(xiàng)組成一個(gè)整體,但共用體中一切的成員變量均占用同一段體,但共用體中一切的成員變量均占用同一段內(nèi)存空間,即共用體變量所占的存儲(chǔ)空間不是內(nèi)存空間,即共用體變量所占的存儲(chǔ)空間不是各成員所需存儲(chǔ)空間字節(jié)數(shù)的總和,而是共用各成員所需存儲(chǔ)空間字節(jié)數(shù)的總和,而是共用體成員中需求空間最大的那個(gè)成員所需的字節(jié)體成員中需求空間最大的那個(gè)成員所需的字節(jié)數(shù)。對(duì)于共用體變量,在某一時(shí)間點(diǎn)上,只能數(shù)。對(duì)于共用體變量,在某一時(shí)間點(diǎn)上,只能存儲(chǔ)其某一成
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版土地租賃與使用權(quán)置換協(xié)議3篇
- 校企攜手2025年度共建紡織工藝培訓(xùn)基地合同3篇
- 二零二五年度文化藝術(shù)展覽場(chǎng)地臨時(shí)使用協(xié)議書3篇
- 2025版建筑工程碎石料采購與安全管理合同3篇
- 2025年度個(gè)人教育培訓(xùn)機(jī)構(gòu)投資合同書(教育連鎖版)4篇
- 二零二五年深海油氣資源開發(fā)電焊工勞務(wù)分包協(xié)議3篇
- 囧媽觀后感15篇
- 個(gè)人出租車的對(duì)外承包協(xié)議書 3篇
- 二零二五版淋浴房環(huán)保材料生產(chǎn)與應(yīng)用合同3篇
- 二零二五年度城市道路施工監(jiān)理合同標(biāo)準(zhǔn)版4篇
- 定額〔2025〕1號(hào)文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 2024年城市軌道交通設(shè)備維保及安全檢查合同3篇
- 【教案】+同一直線上二力的合成(教學(xué)設(shè)計(jì))(人教版2024)八年級(jí)物理下冊(cè)
- 湖北省武漢市青山區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末質(zhì)量檢測(cè)數(shù)學(xué)試卷(含解析)
- 單位往個(gè)人轉(zhuǎn)賬的合同(2篇)
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國式摔跤課程學(xué)生運(yùn)動(dòng)能力測(cè)評(píng)規(guī)范
- 高危妊娠的評(píng)估和護(hù)理
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫含答案解析
- 兒童10歲生日-百日宴-滿月酒生日會(huì)成長(zhǎng)相冊(cè)展示(共二篇)
- 2023年高考全國甲卷數(shù)學(xué)(理)試卷【含答案】
評(píng)論
0/150
提交評(píng)論