結(jié)構(gòu)體與共用體課件_第1頁(yè)
結(jié)構(gòu)體與共用體課件_第2頁(yè)
結(jié)構(gòu)體與共用體課件_第3頁(yè)
結(jié)構(gòu)體與共用體課件_第4頁(yè)
結(jié)構(gòu)體與共用體課件_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章

結(jié)構(gòu)體與共用體《C語(yǔ)言程序設(shè)計(jì)》《C語(yǔ)言程序設(shè)計(jì)》結(jié)構(gòu)體和共用體第九章

9.1結(jié)構(gòu)體的說(shuō)明和定義

9.2結(jié)構(gòu)體成員的引用與結(jié)構(gòu)體變量的初始化

9.3結(jié)構(gòu)體數(shù)組

9.4結(jié)構(gòu)體指針

9.5結(jié)構(gòu)體在函數(shù)間的傳遞

9.6結(jié)構(gòu)體型和結(jié)構(gòu)體指針型函數(shù)

9.7共用體簡(jiǎn)介9.8枚舉類型9.9用typedef定義類型第9章結(jié)構(gòu)體和共用體

9.1.1結(jié)構(gòu)體的概念

9.1.2結(jié)構(gòu)體的說(shuō)明

9.1.3結(jié)構(gòu)體變量的定義9.1結(jié)構(gòu)體的說(shuō)明和定義9.1結(jié)構(gòu)體的說(shuō)明和定義在程序的設(shè)計(jì)中,會(huì)遇見(jiàn)一些關(guān)系密切、具有內(nèi)在聯(lián)系而且數(shù)據(jù)類型不同的數(shù)據(jù)。例如,一個(gè)班、一個(gè)年級(jí)或全校學(xué)生的學(xué)籍卡包括:他們的學(xué)號(hào)、姓名、性別、年齡、學(xué)習(xí)成績(jī)、地址....等。這些數(shù)據(jù)有的是數(shù)字、有的是字符,其數(shù)據(jù)類型不同,對(duì)于這樣一類數(shù)據(jù)可以用結(jié)構(gòu)體來(lái)處理。9.1.1結(jié)構(gòu)體的概念結(jié)構(gòu)體是不同數(shù)據(jù)類型的數(shù)據(jù)的集合。結(jié)構(gòu)體是構(gòu)造類型的數(shù)據(jù)。一個(gè)結(jié)構(gòu)體由若干成員組成。它是組成結(jié)構(gòu)體的要素。每個(gè)成員的數(shù)據(jù)類型可以不同,也可以相同。每個(gè)成員有自己的名字。對(duì)結(jié)構(gòu)體數(shù)據(jù)的操作是通過(guò)對(duì)結(jié)構(gòu)體成員的引用實(shí)現(xiàn)的。結(jié)構(gòu)體的應(yīng)用為處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)體提供了有利的手段。特別是對(duì)處理那些數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜的程序提供了方便。每一個(gè)結(jié)構(gòu)體有一個(gè)名字,所有成員都組織在該名字之下。結(jié)構(gòu)體名結(jié)構(gòu)體成員名9.1.1結(jié)構(gòu)體的概念9.1.2結(jié)構(gòu)體的說(shuō)明由于結(jié)構(gòu)體是由不同數(shù)據(jù)類型的數(shù)據(jù)組成的集合體。它包含若干成員。因此,在使用結(jié)構(gòu)體進(jìn)行數(shù)據(jù)處理時(shí),首先應(yīng)對(duì)結(jié)構(gòu)體的組成進(jìn)行描述。這種描述稱為結(jié)構(gòu)體說(shuō)明。結(jié)構(gòu)體說(shuō)明實(shí)質(zhì)上是構(gòu)造一個(gè)結(jié)構(gòu)體。說(shuō)明的是結(jié)構(gòu)體是由哪些成員組成以及成員的數(shù)據(jù)類型。結(jié)構(gòu)體說(shuō)明的格式:struct

(是保留字)結(jié)構(gòu)體類型標(biāo)識(shí)符。結(jié)構(gòu)體名(稱結(jié)構(gòu)體類型名)由標(biāo)識(shí)符組成。大括號(hào)中的結(jié)構(gòu)體成員表,稱為結(jié)構(gòu)體。結(jié)構(gòu)體成員表包含若干成員。struct

結(jié)構(gòu)體名{結(jié)構(gòu)體成員表;};成員的表達(dá)形式:數(shù)據(jù)類型標(biāo)識(shí)符結(jié)構(gòu)體成員名;成員的數(shù)據(jù)類型例:用結(jié)構(gòu)建立學(xué)生的學(xué)籍卡(數(shù)據(jù)體)。structstudent{longnum;charname[20];charsex;

intage;floatscore;charaddr[30];}student1,student2,....;

student1student2…student30結(jié)構(gòu)體變量名結(jié)構(gòu)體成員名結(jié)構(gòu)體名結(jié)構(gòu)體類型標(biāo)識(shí)符有關(guān)結(jié)構(gòu)體說(shuō)明應(yīng)注意以下幾點(diǎn):結(jié)構(gòu)體說(shuō)明描述了結(jié)構(gòu)體的組織形式,在程序編譯時(shí)并不為它分配存儲(chǔ)空間。結(jié)構(gòu)體成員可以是簡(jiǎn)單變量、數(shù)組、指針、結(jié)構(gòu)體或聯(lián)合體等。所以,結(jié)構(gòu)體可以嵌套使用,即一個(gè)結(jié)構(gòu)體變量也可以成為另一個(gè)結(jié)構(gòu)體的成員。結(jié)構(gòu)體說(shuō)明可以在函數(shù)內(nèi)部,也可以在函數(shù)外部。若程序規(guī)模較大,可把其結(jié)構(gòu)體說(shuō)明部分作為文件存放起來(lái)(該文件是以.h為后綴的“頭文件”),這樣可借助于“#include”預(yù)編輯語(yǔ)句把它復(fù)制到任何源文件中,用以定義同類型的其它結(jié)構(gòu)體變量。結(jié)構(gòu)體成員名可以與程序中其它變量同名,系統(tǒng)會(huì)自動(dòng)識(shí)別它們,兩者不會(huì)混淆。student1structdate{intmonth;

intday;

intyear;};定義一個(gè)structdate結(jié)構(gòu)體,它代表日期包括三個(gè)成員,month(月)、day(日)、year(年)。結(jié)構(gòu)體成員可以是另一結(jié)構(gòu)體變量structstudent{longnum;charname[20];charsex;

intage;floatscore;charaddr[30];

struct

datebirthday;};在定義structstudent結(jié)構(gòu)體時(shí),成員birthday被定義structdate類型。即結(jié)構(gòu)體成員為另一結(jié)構(gòu)體變量。已定義的(結(jié)構(gòu))類型structdate與其他類型(int、char)一樣可以用來(lái)定義結(jié)構(gòu)體成員的類型。例:成員name、addr是數(shù)組類型9.1.3結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量同其它變量一樣也必須先說(shuō)明、定義,然后才能引用。結(jié)構(gòu)體變量定義要按照結(jié)構(gòu)體說(shuō)明中的結(jié)構(gòu)體類型,為被定義的結(jié)構(gòu)體變量分配內(nèi)存單元,而結(jié)構(gòu)體說(shuō)明不分配內(nèi)存。對(duì)結(jié)構(gòu)體中數(shù)據(jù)(結(jié)構(gòu)體成員)的操作是通過(guò)結(jié)構(gòu)體變量的引用來(lái)實(shí)現(xiàn)的。用結(jié)構(gòu)體變量可以對(duì)結(jié)構(gòu)體成員進(jìn)行賦值、存取或運(yùn)算。1、結(jié)構(gòu)體變量的作用2、結(jié)構(gòu)體變量定義的意義例如:

structstudent{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}student1,student2,student3;(1)在結(jié)構(gòu)體說(shuō)明的同時(shí)定義結(jié)構(gòu)體變量該例結(jié)構(gòu)體名為student,用它定義了三個(gè)結(jié)構(gòu)體變量student1、student2、student3,三個(gè)變量具有相同的組成結(jié)構(gòu)體,即相同的類型。

這種定義方法的特點(diǎn)是:定義一次結(jié)構(gòu)體變量之后,在該定義之后的任何位置還可用該結(jié)構(gòu)體類型來(lái)定義其它結(jié)構(gòu)體變量。3、結(jié)構(gòu)體變量定義格式結(jié)構(gòu)體變量定義的三種形式:struct

結(jié)構(gòu)體名{結(jié)構(gòu)體成員表;}結(jié)構(gòu)體變量名表;其定義格式為:例如:struct

{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}student1,student2,student3;不出現(xiàn)結(jié)構(gòu)體名這里定義了三個(gè)結(jié)構(gòu)體變量與(1)相同。這種定義方法的特點(diǎn)是:struct

{

結(jié)構(gòu)體成員表;}結(jié)構(gòu)體變量名表;(2)直接定義結(jié)構(gòu)體變量其定義形式為:不出現(xiàn)結(jié)構(gòu)體名這種定義方法的特點(diǎn)是:不能在別處用來(lái)另行定義別的結(jié)構(gòu)體變量,要想定義就必須將struct{}這部分重寫。例如:structstudent{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];};......structstudentstudent1,student2,student3;這種定義方法的特點(diǎn)是:可把其結(jié)構(gòu)體說(shuō)明部分作為文件存放起來(lái),這樣可借助于“#include”預(yù)編輯語(yǔ)句把它復(fù)制到任何源文件中,用以定義同類型的其它結(jié)構(gòu)體變量。

struct

結(jié)構(gòu)體名{結(jié)構(gòu)體成員表;};.....[存貯類型]

struct

結(jié)構(gòu)體名結(jié)構(gòu)體變量名表;(3)把定義和說(shuō)明分開(kāi)其定義格式為:注意結(jié)構(gòu)體聲明和結(jié)構(gòu)體變量定義的區(qū)別。每個(gè)結(jié)構(gòu)體變量表示的是一組(域)成員(數(shù)據(jù))。而不是一個(gè)數(shù)據(jù)。每個(gè)結(jié)構(gòu)體中所有結(jié)構(gòu)體變量的結(jié)構(gòu)(類型)是一樣的。在一個(gè)結(jié)構(gòu)體中可以定義多少個(gè)結(jié)構(gòu)體成員。結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體說(shuō)明之后或與結(jié)構(gòu)體說(shuō)明同時(shí)進(jìn)行。結(jié)構(gòu)體變量一般不用register寄存器型的存儲(chǔ)方式。結(jié)構(gòu)體變量中的成員可以單獨(dú)使用,其作用和地位與一般變量相同。結(jié)構(gòu)體變量占用實(shí)際內(nèi)存的大小可用sizeof()運(yùn)算來(lái)實(shí)現(xiàn)。即:sizeof(結(jié)構(gòu)體名)。結(jié)構(gòu)體變量的定義應(yīng)注意的幾點(diǎn):9.2結(jié)構(gòu)體成員的引用與結(jié)構(gòu)體變量的初始化

9.2.1結(jié)構(gòu)體成員的引用

9.2.2結(jié)構(gòu)體變量的初始化9.2結(jié)構(gòu)體成員的引用與結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體成員引用有三種方式:9.2.1結(jié)構(gòu)體成員的引用(2)用指針的方式(1)用結(jié)構(gòu)體成員運(yùn)算符方式定義一個(gè)指針結(jié)(構(gòu)體指針),使它指向該結(jié)構(gòu)體變量,這時(shí)就可用指針和成員名來(lái)引用結(jié)構(gòu)體成員了。即:結(jié)構(gòu)體變量名.成員名。(3)用“->”指向運(yùn)算符引用結(jié)構(gòu)體成員定義一個(gè)指針(結(jié)構(gòu)體指針),使它指向該結(jié)構(gòu)體變量,這時(shí)就可用指針和成員名來(lái)引用結(jié)構(gòu)體成員了。其格式為:指針名->結(jié)構(gòu)體成員名例:structstudent{longnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2;結(jié)構(gòu)體成員的引用:用結(jié)構(gòu)成員運(yùn)算符“.”引用結(jié)構(gòu)體成員structstudentstu1;structstudentstu2;stu1.num=2010001;stu1.sex=‘M’;stu1.age=18;stu1.score=87;Strcpy(stu1.addr,“Beijing”);用結(jié)構(gòu)成員運(yùn)算符“.”引用結(jié)構(gòu)體成員格式:“.”結(jié)構(gòu)體成員運(yùn)算符結(jié)構(gòu)體成員運(yùn)算符就表示對(duì)結(jié)構(gòu)體成員的引用結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員(2)不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體加以引用。(3)對(duì)結(jié)構(gòu)體成員的操作與其它變量一樣,可進(jìn)行各種運(yùn)算。結(jié)構(gòu)體成員引用的幾點(diǎn)說(shuō)明:例:stu1.num作為一個(gè)整體來(lái)看待,并對(duì)其操作。*stu1.num“.”優(yōu)先于“*”,其等效為*(stu1.num)。其含義為訪問(wèn)stu1.num(所指地址中的內(nèi)容)的目標(biāo)變量。賦值運(yùn)算:stu1.score=stu2.score;算術(shù)運(yùn)算:sum=(stu1.score+stu2.score)/2;自加減運(yùn)算:stu1.age++;++stu1.age;關(guān)系運(yùn)算:stu1.age>=stu2.age;例:printf(“%d,%s,%c,%d,%f,%s”,stu1);×(1)結(jié)構(gòu)體成員運(yùn)算符“.”的優(yōu)先級(jí)最高,結(jié)合性為左結(jié)合(從左至右)。用結(jié)構(gòu)體成員運(yùn)算符9.2.2結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量初始化的格式:對(duì)結(jié)構(gòu)體變量初始化應(yīng)注意幾點(diǎn):(1)只能對(duì)存儲(chǔ)類型為extern外部型和static靜態(tài)型結(jié)構(gòu)體變量初始化,不能對(duì)存儲(chǔ)類型為auto自動(dòng)型的結(jié)構(gòu)體變量初始化。(2)初始化數(shù)據(jù)與數(shù)據(jù)之間用逗號(hào)隔開(kāi)。(3)初始化數(shù)據(jù)的個(gè)數(shù)要與被賦值的結(jié)構(gòu)體成員的個(gè)數(shù)相等。(4)初始化數(shù)據(jù)的類型要與相應(yīng)的結(jié)構(gòu)體成員的數(shù)據(jù)類型一致。(5)不能直接在結(jié)構(gòu)體成員表中對(duì)成員賦初值。結(jié)構(gòu)體變量的初始化,就是在定義結(jié)構(gòu)體變量的同時(shí),對(duì)其成員賦初值。規(guī)定,只準(zhǔn)許對(duì)外部和靜態(tài)結(jié)構(gòu)體變量進(jìn)行初始化,不能對(duì)自動(dòng)類型的結(jié)構(gòu)體變量初始化。struct

結(jié)構(gòu)體名結(jié)構(gòu)體變量名={初始數(shù)據(jù)};例:structstudent{longnum;charname[20];charsex;

intage;floatscore;charaddr[30];};structstudentstu1={2010001,“Lifeng”,‘M’,18,87.0,“Beijing”};structstudent{longnum=2010001;charname[20]=“Lifeng”;charsex=‘M’;

intage=18;floatscore=87.0;charaddr[30]=“Beijing”;}stu1,stu2;×不能直接在結(jié)構(gòu)體成員表中對(duì)成員賦初值例9-1用scanf函數(shù)將結(jié)構(gòu)體變量數(shù)據(jù)輸入,用printf函數(shù)將其輸出。main(){structstudent{longnum;charname[20];charsex;floatscore;charaddr[30];};

structstudentstu1;scanf("%c",&stu1.sex);scanf("%ld",&stu1.num);scanf("%s",);scanf("%f",&stu1.score);scanf("%s",stu1.addr);printf("\nnum:%ld\n",stu1.num);printf("name:%s\n",);printf("sex:%c\n",stu1.sex);printf("score:%.2f\n",stu1.score);printf("addr:%s\n",stu1.addr);}運(yùn)行程序M<CR>2010001<CR>Lifeng<CR>87<CR>Beijing<CR>num:2010001name:Lifengsex:Mscore:87addr:Beijing例

main(){structdate{intday;

intmonth;

intyear;charmon_name[10];};

structdatea={28,7,1997,"July"};

printf("day:%d\n",a.day);

printf("month:%d\n",a.month);

printf("year:%d\n",a.year);

printf("mon_name:%s\n",a.mon_name);}運(yùn)行程序day:28month:7year:1997mon_name:July9.3結(jié)構(gòu)體數(shù)組

9.3.1結(jié)構(gòu)體數(shù)組的概念

9.3.2結(jié)構(gòu)體數(shù)組的定義

9.3.3結(jié)構(gòu)體數(shù)組的初始化

9.3.4結(jié)構(gòu)體數(shù)組的應(yīng)用舉例9.3結(jié)構(gòu)體數(shù)組stu1stu2…stu30structstudent{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2,…stu29;例如:一個(gè)班級(jí)學(xué)生的學(xué)籍卡的數(shù)據(jù)結(jié)構(gòu)如下,要使用該結(jié)構(gòu)體中每個(gè)學(xué)生的數(shù)據(jù),就要定義30個(gè)結(jié)構(gòu)體變量(名),即:stu1,stu2...stu30。這種方法很不方便。由于該例結(jié)構(gòu)體變量名都相同,就是最后的序號(hào)不同,這種情況可使用結(jié)構(gòu)體數(shù)組。

結(jié)構(gòu)體數(shù)組是其數(shù)組元素都是具有相同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量。即結(jié)構(gòu)體數(shù)組是結(jié)構(gòu)體變量集合的一種數(shù)組。結(jié)構(gòu)體數(shù)組元素中可存放哪些具有內(nèi)在聯(lián)系、相互關(guān)聯(lián)的結(jié)構(gòu)體變量。結(jié)構(gòu)體數(shù)組適合處理一組具有相同結(jié)構(gòu)體類型的數(shù)據(jù)。9.3.1結(jié)構(gòu)體數(shù)組的概念stu[30];9.3.2結(jié)構(gòu)體數(shù)組的定義例如:staticstructstudentstu[30];例中定義了30個(gè)結(jié)構(gòu)體變量,下標(biāo)0-29(下標(biāo)從0開(kāi)始),結(jié)構(gòu)體變量是stu[0]、stu[1]、stu[2]、.....stu[29]。結(jié)構(gòu)體數(shù)組也必須先定義或說(shuō)明,后引用。結(jié)構(gòu)體數(shù)組定義的格式:[存儲(chǔ)類型]struct

結(jié)構(gòu)體名結(jié)構(gòu)體數(shù)組名[元素個(gè)數(shù)][,結(jié)構(gòu)體名[元素個(gè)數(shù)],....];結(jié)構(gòu)體數(shù)組定義的說(shuō)明:在結(jié)構(gòu)體數(shù)組定義中,結(jié)構(gòu)體即:“struct

結(jié)構(gòu)體名”是已被說(shuō)明的結(jié)構(gòu)體類型。先說(shuō)明后定義。存儲(chǔ)類型是結(jié)構(gòu)體數(shù)組(即結(jié)構(gòu)體變量)的存儲(chǔ)類型。結(jié)構(gòu)體數(shù)組與前面介紹的數(shù)值型數(shù)組不同之處在于每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù),它們分別包含各個(gè)成員項(xiàng)(一組數(shù)據(jù))。9.3.3結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化,就是在定義結(jié)構(gòu)體數(shù)組的同時(shí),對(duì)其成員賦初值。結(jié)構(gòu)體數(shù)組的初始化格式為:[存儲(chǔ)類型]struct

結(jié)構(gòu)體名結(jié)構(gòu)體數(shù)組名[元素個(gè)數(shù)]={初始化數(shù)據(jù)};說(shuō)明:結(jié)構(gòu)體即“struct

結(jié)構(gòu)體名”是已被說(shuō)明的結(jié)構(gòu)體類型。初始化的數(shù)據(jù)的個(gè)數(shù)與結(jié)構(gòu)體數(shù)組元素的個(gè)數(shù)相同,數(shù)據(jù)類型相匹配。為了提高可讀性,最好每一個(gè)數(shù)組元素(結(jié)構(gòu)體變量)的初始數(shù)據(jù)都用花括號(hào)括起來(lái)。初始化結(jié)構(gòu)體成員數(shù)據(jù)之間、數(shù)組元素之間用逗號(hào)隔開(kāi)。[存儲(chǔ)類型]struct

結(jié)構(gòu)體名{結(jié)構(gòu)體成員表;}結(jié)構(gòu)體數(shù)組名[元素個(gè)數(shù)]={初始化數(shù)據(jù)};或例:structstudent{longnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu[30]={{2010001,“Lifeng”,‘M’,18,87,“Beijing”},{2010002,“Wangbing”,‘M’,18,79,“Beijing”},........{2010030,“Chenming”,‘M’,17,80,“Beijing”}};例中給結(jié)構(gòu)體變量stu[0]、stu[1]、....Stu[29]的各個(gè)成員賦初值。structstudent{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];};structstudentstu[30]={{2010001,“Lifeng”,‘M’,18,87,“Beijing”},{2010002,“Wangbing”,‘M’,18,79,“Beijing”},........{2010030,“Chenming”,‘M’,17,80,“Beijing”}};結(jié)構(gòu)體數(shù)組的初始化也可用以下的形式:例9.2下述程序的輸出結(jié)果是:main(){struct

copml{intx;

inty;}coum[2]={1,3,2,7};printf(“%d”,coum[0].y/coum[0].x*coum[1].x);}A)0B)1C)3D)6答案:

D3129.4結(jié)構(gòu)體指針

9.4.1結(jié)構(gòu)體指針的概念

9.4.2結(jié)構(gòu)體指針的定義和引用

9.4.3通過(guò)結(jié)構(gòu)體指針引用結(jié)構(gòu)體成員

9.4.4結(jié)構(gòu)體指針的應(yīng)用9.4結(jié)構(gòu)體指針結(jié)構(gòu)體指針是指向結(jié)構(gòu)體變量的指針。結(jié)構(gòu)體指針是一個(gè)指針變量,用來(lái)指向結(jié)構(gòu)體變量;其目標(biāo)變量是一個(gè)結(jié)構(gòu)體變量,其目標(biāo)是一個(gè)結(jié)構(gòu)體變量的(一組)數(shù)據(jù),其內(nèi)容是結(jié)構(gòu)體變量的(首)地址。結(jié)構(gòu)體指針定義的格式:9.4.1結(jié)構(gòu)體指針的概念9.4.2結(jié)構(gòu)體指針變量的定義和引用[存儲(chǔ)類型]struct

結(jié)構(gòu)體名*結(jié)構(gòu)體指針名;例如:

staticstructstudent*pstu;structstudent是預(yù)先說(shuō)明的結(jié)構(gòu)體。*pstu

結(jié)構(gòu)體指針的存儲(chǔ)類型是static。(1)結(jié)構(gòu)體名必須是已經(jīng)說(shuō)明的結(jié)構(gòu)體。structstudent{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2,..stu30;staticstructstudent*pstu;pstu=&stu1;(2)結(jié)構(gòu)體指針變量在使用前必須要進(jìn)行賦值操作,以把某個(gè)結(jié)構(gòu)體變量的地址賦給結(jié)構(gòu)體指針,使它指向該結(jié)構(gòu)體變量。structstudent{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu[30];staticstructstudent*pstu;pstu=&stu[0];結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體指針變量的定義和引用應(yīng)注意的問(wèn)題:(3)結(jié)構(gòu)體指針?biāo)赶虻慕Y(jié)構(gòu)體變量必須與定義時(shí)所規(guī)定的結(jié)構(gòu)體類型一致。structstudent1{intnum;charname[20];charsex;

intage;

floatscore;charaddr[30];}stu1[30];staticstructstudent1*pstu1;pstu1=stu2;structstudent2{intnum;charname[20];charsex;

intage;charaddr[30];}stu2[30];staticstructstudent2*pstu2;pstu2=stu1;上例中的兩個(gè)結(jié)構(gòu)體的結(jié)構(gòu)類型(結(jié)構(gòu)體成員)不同。結(jié)構(gòu)體指針*pstu1和*pstu2不能指向?qū)Ψ降慕Y(jié)構(gòu)體變量。(4)結(jié)構(gòu)體指針的運(yùn)算原則同一般指針一樣。例如:結(jié)構(gòu)體指針的加1或減1運(yùn)算(加、減整型常量),其含義是將指針指向下一個(gè)或上一個(gè)結(jié)構(gòu)體變量。9.4.3通過(guò)結(jié)構(gòu)體指針引用結(jié)構(gòu)體成員例如:structstudent{intnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu[30];structstudent*pstu;pstu=stu;以下引用是正確的

stu[0].numstu[0].name(*(pstu+2)).num(*pstu).name

(Pstu+2)->sexpstu->age在定義結(jié)構(gòu)體指針以后,就可以用結(jié)構(gòu)體指針引用結(jié)構(gòu)體成員。引用的方法如下:(*結(jié)構(gòu)體指針名).成員名結(jié)構(gòu)體指針名->成員名或例如:structdata{intx;

inty;}a;structdata*p;p=&a;用結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員名引用a.xa.y用(*結(jié)構(gòu)體指針名).結(jié)構(gòu)體成員名引用(*p).x(*p).y用結(jié)構(gòu)體指針名->結(jié)構(gòu)體成員名引用p->xp->y結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員名結(jié)構(gòu)體成員引用的三種形式:(*結(jié)構(gòu)體指針名).結(jié)構(gòu)體成員名結(jié)構(gòu)體指針名->結(jié)構(gòu)體成員名例如:

structdata{intx;

int*y;}a[10];

structdata*p;p=a;引用結(jié)構(gòu)體成員x。等效為*(p.y)p.y是一個(gè)指針,*p.y是取該指針的目標(biāo)。意義同上。等效為++(p->x)結(jié)構(gòu)體成員x加1。引用結(jié)構(gòu)體成員x之前結(jié)構(gòu)體指針p加1。即a[1]的成員x先引用結(jié)構(gòu)體成員x,然后結(jié)構(gòu)體指針p加1。引用x內(nèi)容后,x加1。先引用結(jié)構(gòu)體成員y所指向的內(nèi)容后,然后其值加1。在應(yīng)用結(jié)構(gòu)體成員的引用及計(jì)算時(shí)應(yīng)注意它們使用的區(qū)別C語(yǔ)言計(jì)算中運(yùn)算符“.”、“->”、“()”、“[]”的優(yōu)先級(jí)最高。(*p).x*p.y*p->x++p->x(++p)->x(p++)->xp->x++(*p->y)++例9-4指向結(jié)構(gòu)體變量指針的應(yīng)用。#include<stdio.h>#include<string.h>main(){structstudent{int

stuno;charname[20];floatscore;};structstudentstu,*p;p=&stu;p->stuno=9701;

strcpy((*p).name,“Liping”);

stu.score=95.5;printf(”\n1StudentNo.%d\nName:%s\nScore:%f\n",p->stuno,p->name,p->score);printf("\n2StudentNo.:%dName:%sScore:%f\n",(*p).stuno,(*p).name,(*p).score);}定義結(jié)構(gòu)體定義結(jié)構(gòu)體成員定義結(jié)構(gòu)體變量和結(jié)構(gòu)體指針變量給結(jié)構(gòu)體成員賦值給結(jié)構(gòu)體指針賦值輸出結(jié)構(gòu)體數(shù)據(jù)運(yùn)行程序1StudentNo:9701Name:Liping

Score:95.5000002StudentNo:9701Name:Liping

Score:95.500000例9-5指向結(jié)構(gòu)體數(shù)組指針的應(yīng)用。structstudent{int

stuno;charname[20];

intscore;};structstudentst[3]={{20001,"Liping",95},{20002,"Zhanghua",93},{20003,"Sunhong",98}};main(){structstudent*p;

printf(“StudentNo.NameSocre\n");for(p=st;p<st+3;p++)printf("%-12d%d-10s%4d\n",p->stuno,p->name,p->score);}定義、初始化結(jié)構(gòu)體數(shù)組定義結(jié)構(gòu)體指針輸出結(jié)構(gòu)體中的數(shù)據(jù)運(yùn)行程序StudentNo.NameScore20001Liping9520002Zhanghua9320003Sunhong98

9.5.1

結(jié)構(gòu)體變量的傳遞

9.5.2

結(jié)構(gòu)體數(shù)組在函數(shù)間的傳遞9.5結(jié)構(gòu)體在函數(shù)間的傳遞9.5結(jié)構(gòu)體在函數(shù)間的傳遞函數(shù)間不僅可以傳遞簡(jiǎn)單變量、數(shù)組、指針等類型的變量,而且還可以傳遞結(jié)構(gòu)體類型的變量。函數(shù)之間結(jié)構(gòu)體變量的傳遞同一般變量一樣,可以用數(shù)據(jù)復(fù)制方式傳遞,也可以用地址復(fù)制方式傳遞。9.5.1結(jié)構(gòu)體變量的傳遞用復(fù)制方式傳遞結(jié)構(gòu)體變量時(shí),可以把結(jié)構(gòu)體變量作為普通變量來(lái)處理。例如兩個(gè)類型相同的結(jié)構(gòu)體變量之間可以進(jìn)行賦值,可以把一個(gè)結(jié)構(gòu)體變量作為一個(gè)參數(shù)以復(fù)制方式傳遞給被調(diào)用函數(shù),函數(shù)也可以返回一個(gè)結(jié)構(gòu)體變量類型的值等。1、用數(shù)據(jù)復(fù)制方式傳遞結(jié)構(gòu)體變量(傳值方式)struct

emp{charname[20];floatsalary;floatcomm;floatsum;};main(){struct

empteacher;

printf("\nEntername:");

scanf("%s",);teacher.salary=315.10;

m=350.60;teacher.sum=teacher.salary+m;

printf("\n%s%.2f",,teacher.salary);printf("%.2f%.2f",m,teacher.sum);

printf("\nCall-FunctionDisplay");

display(teacher);

printf("\nAfterCall-Function");

printf("\n%s%.2f",,teacher.salary);printf("%.2f%.2f",m,teacher.sum);}例9-6用數(shù)據(jù)復(fù)制方式傳遞結(jié)構(gòu)體變量。定義結(jié)構(gòu)體變量teacher調(diào)用函數(shù)display調(diào)用時(shí)把結(jié)構(gòu)體變量teacher作為實(shí)參傳遞給被調(diào)用函數(shù)的形參p。實(shí)參、形參具有相同的結(jié)構(gòu)體類型。display(p)struct

empp;{printf("\n%s%.2f%.2f%.2f",,p.salary,m,p.sum);

p.salay=519.50;

m=410.50;p.sum=p.salay+m;

printf("\n%s%.2f%.2f%.2f",,p.salary,m,p.sum);}程序運(yùn)行EnterName;zhangping<CR>zhangping315.10350.60665.70Call-FunctingDisplayzhangping315.10315.60665.70zhangping519.50410.50930.00AfterCall-FunctingDisplayzhangping315.10315.60665.70定義函數(shù)display,其形參p為結(jié)構(gòu)體變量例9-6用數(shù)據(jù)復(fù)制方式傳遞結(jié)構(gòu)體變量的說(shuō)明pteacher1.調(diào)用函數(shù)display:調(diào)用時(shí)把結(jié)構(gòu)體變量teacher作為實(shí)參傳遞給被調(diào)用函數(shù)的形參p。實(shí)參、形參具有相同的結(jié)構(gòu)體類型。P接收調(diào)用時(shí)傳遞給被調(diào)用函數(shù)的數(shù)據(jù)。2.結(jié)構(gòu)體變量p和teacher在運(yùn)行時(shí)占用互不相同的存儲(chǔ)空間。在傳遞參數(shù)時(shí),把teacher的各個(gè)成員的值復(fù)制給p的各個(gè)成員。3.形參和實(shí)參代表兩個(gè)不同的結(jié)構(gòu)體變量,其結(jié)構(gòu)體類型相同,但運(yùn)行時(shí)分配不同的存儲(chǔ)空間。但被調(diào)用函數(shù)不能修改實(shí)參所對(duì)應(yīng)的結(jié)構(gòu)體變量。9.5結(jié)構(gòu)體在函數(shù)間的傳遞9.5.1結(jié)構(gòu)體變量的傳遞采用地址復(fù)制方式傳遞結(jié)構(gòu)體變量時(shí),實(shí)參是結(jié)構(gòu)體變量的地址,形參是與實(shí)參有相同結(jié)構(gòu)體類型的指針,該指針用來(lái)接收傳遞的結(jié)構(gòu)體變量首地址。被調(diào)用函數(shù)通過(guò)該指針來(lái)處理實(shí)參所對(duì)應(yīng)的結(jié)構(gòu)體變量的各成員。用地址復(fù)制方式傳遞結(jié)構(gòu)體變量是常用的傳遞方式。所以,利用地址復(fù)制方式傳遞結(jié)構(gòu)體變量時(shí),被調(diào)用函數(shù)可以修改結(jié)構(gòu)體變量的成員。2.用地址復(fù)制方式傳遞結(jié)構(gòu)體變量(傳址方式)10 #include<stdio.h>20 #include<string.h>30 structdate /*定義結(jié)構(gòu)體*/40 {intday;50 intmonth;60 intyear;70 charname[20];80 };90main()100{structdateymd;110structdate*pd;120pd=&ymd;130printf("Enteryear-month-day:");140scanf("%d,%d,%d,%s",&ymd.year,&ymd.month,&ymd.day,);/*給結(jié)構(gòu)體變量ymd賦值*/

例9-7程序處理采用地址復(fù)制方式。日,月。年。150printf("%d,%d,%d,%s\n",(*pd).year,(*pd).month,(*pd).day,(*pd).name);160day(&ymd);170printf("%d,%d,%d,%s",(*pd).year,(*pd).month,(*pd).day,(*pd).name);}180day(pd) /*定義函數(shù)day()函數(shù)的形參為指針變量,接收實(shí)參的結(jié)構(gòu)體變量的地址,指針指向結(jié)構(gòu)體變量ymd.*/190 structdate*pd;200 {pd->year=2002;210 }程序運(yùn)行Enteryear-month-day:2001,9,1,zhang<CR>2001,9,1,zhang2002,9,1,zhang例9.7的說(shuō)明:在調(diào)用day()函數(shù)時(shí),其實(shí)參是結(jié)構(gòu)體變量的首地址&ymd。day()函數(shù)的定義中,形參pd是與實(shí)參具有相同結(jié)構(gòu)體類型的指針變量,該指針變量接收傳遞過(guò)來(lái)的實(shí)參地址,即結(jié)構(gòu)體變量ymd的首地址。函數(shù)通過(guò)pd訪問(wèn)結(jié)構(gòu)體變量ymd,并可修改其成員值,例如:pd->year=2002將ymd變量的year值改為2002。9.5.2結(jié)構(gòu)體數(shù)組在函數(shù)間的傳遞例9-8的說(shuō)明:主函數(shù)main()定義的結(jié)構(gòu)體數(shù)組list[],用于存放學(xué)生的成績(jī)冊(cè)。函數(shù)調(diào)用input(&list[i])中的實(shí)參是結(jié)構(gòu)體數(shù)組list[i]的首地址。input()函數(shù)用于建立該成績(jī)冊(cè),用于輸入一個(gè)學(xué)生的有關(guān)信息;其形參sp是一個(gè)structstudent結(jié)構(gòu)體類型的指針,用于接收結(jié)構(gòu)體數(shù)組(元素)的首地址。display()函數(shù)用于顯示學(xué)生的成績(jī)冊(cè)。函數(shù)調(diào)用display(list,i)中的實(shí)參list是結(jié)構(gòu)體數(shù)組名,i是輸入第幾個(gè)學(xué)生的數(shù)。display()函數(shù)調(diào)用時(shí),其形參pm是structstudent結(jié)構(gòu)體類型的指針,用于接收結(jié)構(gòu)體數(shù)組(元素〕的首地址。函數(shù)不僅可以傳遞一般結(jié)構(gòu)體變量,而且還可以傳遞結(jié)構(gòu)體數(shù)組。在傳遞結(jié)構(gòu)體數(shù)組時(shí),實(shí)參是數(shù)組名,即結(jié)構(gòu)體數(shù)組的地址;形參是結(jié)構(gòu)體指針,它接收傳遞過(guò)來(lái)的數(shù)組首地址,使它指向?qū)崊⑺硎镜慕Y(jié)構(gòu)體數(shù)組。例9-8學(xué)生成績(jī)冊(cè)的建立和顯示。采用結(jié)構(gòu)體數(shù)組在函數(shù)間的傳遞。10 #include<stdio.h>20 #defineMAX230 structstudent40 {charid[6];50charname[20];60intscore;70};80main()90{structstudentlist[MAX];100inti;110for(i=0;i<MAX;i++)120if(input(&list[i])==0)130break;140printf("\n");150display(list,i);160}170input(sp) 180structstudent*sp;190{chars[5];200printf("\nEnterID:");210gets(sp->id);220printf("EnterName:");230gets(sp->name);240if(sp->name[0]=='\0') 250return(0);260printf("Enterscore:");270gets(s);280sp->score=atoi(s);290return(1);300}310display(pm,m) 320structstudent*pm;330intm;340{inti;350printf("--------------------------------\n");360for(i=0;i<m;i++,pm++)370printf("%-10s%-15s%d\n",pm->id,pm->name,pm->score);380}input()函數(shù)的作用是給結(jié)構(gòu)體變量中各成員賦值display()函數(shù)的作用是顯示結(jié)構(gòu)體變量中各成員的值若不給結(jié)構(gòu)體成員name賦值僅按<CR>,則函數(shù)input()返回值為0。9.6結(jié)構(gòu)體型和結(jié)構(gòu)體指針型函數(shù)

9.6.1結(jié)構(gòu)體型函數(shù)

9.6.2結(jié)構(gòu)體指針型函數(shù)9.6結(jié)構(gòu)體型和結(jié)構(gòu)體指針型函數(shù)結(jié)構(gòu)體型函數(shù)說(shuō)明的一般形式:9.6.1

結(jié)構(gòu)體型函數(shù)如果函數(shù)返回值是某一結(jié)構(gòu)體變量時(shí),則稱該函數(shù)是結(jié)構(gòu)體型函數(shù),該函數(shù)的數(shù)據(jù)類型就是這個(gè)結(jié)構(gòu)體變量所具有的結(jié)構(gòu)體類型。結(jié)構(gòu)體型函數(shù)定義的一般形式:struct

結(jié)構(gòu)體名函數(shù)名([形參表])[形參說(shuō)明;]{內(nèi)部數(shù)據(jù)說(shuō)明語(yǔ)句;執(zhí)行語(yǔ)句;return(結(jié)構(gòu)體變量);};struct

結(jié)構(gòu)體名函數(shù)名();#include<string.h>struct

datatype{charstr[20];

intx;floaty;};main(){struct

datatyperev;

struct

datatype

func();

printf("CallFunction\n");

rev=func();

printf("rev.str[]=%srev.x=%drev.y=%.2f\n",rev.str,rev.x,rev.y);}

struct

datatype

func(){struct

datatypetest;

strcpy(test.str,"teststring");test.x=45;test.y=147.45;

printf("test.str[]=%stest.x=%dtest.y=%.2f\n",test.str,test.x,test.y);

printf("Afterreturn\n");return(test);}例9-9返回值為結(jié)構(gòu)體變量的函數(shù)。定義結(jié)構(gòu)體型函數(shù)結(jié)構(gòu)體函數(shù)的說(shuō)明程序運(yùn)行CallFunctiontest.str[]=teststringtest.x=45test.y=147.45Afterreturnrev.str[]=teststringrev.x=45rev.y=147.45調(diào)用函數(shù)例9-9的說(shuō)明:函數(shù)func()被定義為結(jié)構(gòu)體型函數(shù),其類型為struct

datatype

。在main()函數(shù)中,rev也是struct

datatype類型的結(jié)構(gòu)體變量,它與func()的類型相同,用rev接收函數(shù)func()的返回值。從運(yùn)行結(jié)果看,結(jié)構(gòu)體變量中各成員的值與test結(jié)構(gòu)體變量相同。因此,rev=func()可以看作結(jié)構(gòu)體變量之間的賦值操作。9.6.2結(jié)構(gòu)體指針型函數(shù)在調(diào)用結(jié)構(gòu)體指針型函數(shù)時(shí),用于接收結(jié)構(gòu)體指針型函數(shù)返回值的變量應(yīng)該是指向與該函數(shù)具有相同結(jié)構(gòu)體類型的結(jié)構(gòu)體指針變量。當(dāng)函數(shù)的返回值是結(jié)構(gòu)體變量的首地址時(shí),稱該函數(shù)為結(jié)構(gòu)體指針型函數(shù),該函數(shù)的數(shù)據(jù)類型為結(jié)構(gòu)體指針型。結(jié)構(gòu)體指針型函數(shù)定義形式:struct

結(jié)構(gòu)體名*函數(shù)名([形參表])[形參說(shuō)明;]{內(nèi)部數(shù)據(jù)說(shuō)明語(yǔ)句;執(zhí)行語(yǔ)句;

return(結(jié)構(gòu)體變量地址);};結(jié)構(gòu)體指針型函數(shù)說(shuō)明的一般形式:struct

結(jié)構(gòu)體名*函數(shù)名();例9-10實(shí)現(xiàn)電話號(hào)碼查尋。假設(shè)有一個(gè)電話號(hào)碼表,給一個(gè)電話號(hào)碼找出該號(hào)碼對(duì)應(yīng)的信息。函數(shù)功能:建立電話號(hào)碼表函數(shù)當(dāng)輸入的電話號(hào)碼為0時(shí),結(jié)束電話號(hào)碼的輸入。(if語(yǔ)句中判斷條件為真,break強(qiáng)制程序退出循環(huán))#defineNULL0structsample{intnum;charname[20];charaddr[80];}list[50];tell_list(){inti;for(i=0;i<50;i++){printf("\nEntertel.number:");

scanf("%d",&list[i].num);

printf("EnterName:");

scanf("%s",list[i].name);

printf("EnterAddress:");

scanf("%s",list[i].addr);if(list[i].num==NULL) break;}return;}structsample*found(n)intn;{inti;for(i=0;i<50/*list[i].name!=NULL*/;i++)if(list[i].num==n)break;return(&list[i]);}main(){intnumber;

structsample*ps;tell_list();for(;;){printf("\nEntertel.number:");

scanf("%d",&number);if(number==NULL) break;

ps=found(number);

if(ps->num!=NULL) {printf("\nNumber=%d",ps->num);

printf("\nName=%s",ps->name);

printf("\nAddress=%s",ps->addr); }else

printf("\nNotfound!");}}定義結(jié)構(gòu)體指針型函數(shù)。函數(shù)功能:根據(jù)給出的電話號(hào)碼查著對(duì)應(yīng)的信息。輸入查找的電話號(hào)碼為0,則退出程序。(if語(yǔ)句中判斷條件為真,break強(qiáng)制程序結(jié)束)。函數(shù)返回值是結(jié)構(gòu)體變量list[i]的首地址結(jié)構(gòu)體指針的說(shuō)明調(diào)用結(jié)構(gòu)體指針型函數(shù)注意:結(jié)構(gòu)體指針型函數(shù)返回結(jié)構(gòu)體首地址,但該結(jié)構(gòu)體一定不能是該函數(shù)中定義的自動(dòng)型結(jié)構(gòu)體變量。9.7共用體簡(jiǎn)介9.7.1共用體的說(shuō)明

9.7.2共用體變量或數(shù)組的定義

9.7.3共用體變量或數(shù)組元素的引用在程序運(yùn)行過(guò)程中,有時(shí)需要使用幾種不同類型的變量存放到同一個(gè)段內(nèi)存單元中。例如,可把一個(gè)整型變量、一個(gè)字符型變量、一個(gè)實(shí)型變量放在同一個(gè)地址開(kāi)始的內(nèi)存單元中。這三個(gè)變量在內(nèi)存中占的字節(jié)數(shù)不同,但都從同一個(gè)地址開(kāi)始存放。也就是使用了覆蓋技術(shù),幾個(gè)變量互相覆蓋。這種使幾個(gè)不同的變量共占同一段內(nèi)存的結(jié)構(gòu),稱為“共用體”。它是一種類似于結(jié)構(gòu)體的構(gòu)造型數(shù)據(jù)類型,它準(zhǔn)許不同類型和不同長(zhǎng)度的數(shù)據(jù)共享同一塊存儲(chǔ)空間。9.7共用體簡(jiǎn)介共用體的說(shuō)明形式為:

union共用體名{數(shù)據(jù)類型1成員1名;數(shù)據(jù)類型2成員2名;………數(shù)據(jù)類型n成員n名;};注意:1.每個(gè)成員都從第一個(gè)字節(jié)開(kāi)始連續(xù)存放.2.共用體中的成員不能同時(shí)使用.3.占用字節(jié)數(shù)等于占用內(nèi)存最多的成員占用的單元數(shù).例如:unioncif{charc1[100];

inti2[100];floatf3[100];};Cif占用單元數(shù):4009.7.1共用體的說(shuō)明同結(jié)構(gòu)體相同,也有三種方法.(1)在共用體說(shuō)明的同時(shí)定義共用體變量其定義格式為:union共用體名{

共用體成員表;}共用體變

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論