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

下載本文檔

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

文檔簡介

第9章

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

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

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共用體簡介9.8枚舉類型9.9用typedef定義類型第9章結(jié)構(gòu)體和共用體

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

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

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

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

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

intday;

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

intage;floatscore;charaddr[30];

struct

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

structstudent{intnum;charname[20];charsex;

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

這種定義方法的特點是:定義一次結(jié)構(gòu)體變量之后,在該定義之后的任何位置還可用該結(jié)構(gòu)體類型來定義其它結(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)體名這里定義了三個結(jié)構(gòu)體變量與(1)相同。這種定義方法的特點是:struct

{

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

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

struct

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

struct

結(jié)構(gòu)體名結(jié)構(gòu)體變量名表;(3)把定義和說明分開其定義格式為:注意結(jié)構(gòu)體聲明和結(jié)構(gòu)體變量定義的區(qū)別。每個結(jié)構(gòu)體變量表示的是一組(域)成員(數(shù)據(jù))。而不是一個數(shù)據(jù)。每個結(jié)構(gòu)體中所有結(jié)構(gòu)體變量的結(jié)構(gòu)(類型)是一樣的。在一個結(jié)構(gòu)體中可以定義多少個結(jié)構(gòu)體成員。結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體說明之后或與結(jié)構(gòu)體說明同時進行。結(jié)構(gòu)體變量一般不用register寄存器型的存儲方式。結(jié)構(gòu)體變量中的成員可以單獨使用,其作用和地位與一般變量相同。結(jié)構(gòu)體變量占用實際內(nèi)存的大小可用sizeof()運算來實現(xiàn)。即:sizeof(結(jié)構(gòu)體名)。結(jié)構(gòu)體變量的定義應(yīng)注意的幾點: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)體成員運算符方式定義一個指針結(jié)(構(gòu)體指針),使它指向該結(jié)構(gòu)體變量,這時就可用指針和成員名來引用結(jié)構(gòu)體成員了。即:結(jié)構(gòu)體變量名.成員名。(3)用“->”指向運算符引用結(jié)構(gòu)體成員定義一個指針(結(jié)構(gòu)體指針),使它指向該結(jié)構(gòu)體變量,這時就可用指針和成員名來引用結(jié)構(gòu)體成員了。其格式為:指針名->結(jié)構(gòu)體成員名例:structstudent{longnum;charname[20];charsex;

intage;floatscore;charaddr[30];}stu1,stu2;結(jié)構(gòu)體成員的引用:用結(jié)構(gòu)成員運算符“.”引用結(jié)構(gòu)體成員structstudentstu1;structstudentstu2;stu1.num=2010001;stu1.sex=‘M’;stu1.age=18;stu1.score=87;Strcpy(stu1.addr,“Beijing”);用結(jié)構(gòu)成員運算符“.”引用結(jié)構(gòu)體成員格式:“.”結(jié)構(gòu)體成員運算符結(jié)構(gòu)體成員運算符就表示對結(jié)構(gòu)體成員的引用結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員(2)不能將一個結(jié)構(gòu)體變量作為一個整體加以引用。(3)對結(jié)構(gòu)體成員的操作與其它變量一樣,可進行各種運算。結(jié)構(gòu)體成員引用的幾點說明:例:stu1.num作為一個整體來看待,并對其操作。*stu1.num“.”優(yōu)先于“*”,其等效為*(stu1.num)。其含義為訪問stu1.num(所指地址中的內(nèi)容)的目標變量。賦值運算:stu1.score=stu2.score;算術(shù)運算:sum=(stu1.score+stu2.score)/2;自加減運算:stu1.age++;++stu1.age;關(guān)系運算:stu1.age>=stu2.age;例:printf(“%d,%s,%c,%d,%f,%s”,stu1);×(1)結(jié)構(gòu)體成員運算符“.”的優(yōu)先級最高,結(jié)合性為左結(jié)合(從左至右)。用結(jié)構(gòu)體成員運算符9.2.2結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量初始化的格式:對結(jié)構(gòu)體變量初始化應(yīng)注意幾點:(1)只能對存儲類型為extern外部型和static靜態(tài)型結(jié)構(gòu)體變量初始化,不能對存儲類型為auto自動型的結(jié)構(gòu)體變量初始化。(2)初始化數(shù)據(jù)與數(shù)據(jù)之間用逗號隔開。(3)初始化數(shù)據(jù)的個數(shù)要與被賦值的結(jié)構(gòu)體成員的個數(shù)相等。(4)初始化數(shù)據(jù)的類型要與相應(yīng)的結(jié)構(gòu)體成員的數(shù)據(jù)類型一致。(5)不能直接在結(jié)構(gòu)體成員表中對成員賦初值。結(jié)構(gòu)體變量的初始化,就是在定義結(jié)構(gòu)體變量的同時,對其成員賦初值。規(guī)定,只準許對外部和靜態(tài)結(jié)構(gòu)體變量進行初始化,不能對自動類型的結(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)體成員表中對成員賦初值例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);}運行程序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);}運行程序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;例如:一個班級學(xué)生的學(xué)籍卡的數(shù)據(jù)結(jié)構(gòu)如下,要使用該結(jié)構(gòu)體中每個學(xué)生的數(shù)據(jù),就要定義30個結(jié)構(gòu)體變量(名),即:stu1,stu2...stu30。這種方法很不方便。由于該例結(jié)構(gòu)體變量名都相同,就是最后的序號不同,這種情況可使用結(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個結(jié)構(gòu)體變量,下標0-29(下標從0開始),結(jié)構(gòu)體變量是stu[0]、stu[1]、stu[2]、.....stu[29]。結(jié)構(gòu)體數(shù)組也必須先定義或說明,后引用。結(jié)構(gòu)體數(shù)組定義的格式:[存儲類型]struct

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

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

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

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

結(jié)構(gòu)體名{結(jié)構(gòu)體成員表;}結(jié)構(gòu)體數(shù)組名[元素個數(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]的各個成員賦初值。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通過結(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)體指針是一個指針變量,用來指向結(jié)構(gòu)體變量;其目標變量是一個結(jié)構(gòu)體變量,其目標是一個結(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)體指針變量的定義和引用[存儲類型]struct

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

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

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

intage;floatscore;charaddr[30];}stu1,stu2,..stu30;staticstructstudent*pstu;pstu=&stu1;(2)結(jié)構(gòu)體指針變量在使用前必須要進行賦值操作,以把某個結(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)注意的問題:(3)結(jié)構(gòu)體指針所指向的結(jié)構(gòu)體變量必須與定義時所規(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;上例中的兩個結(jié)構(gòu)體的結(jié)構(gòu)類型(結(jié)構(gòu)體成員)不同。結(jié)構(gòu)體指針*pstu1和*pstu2不能指向?qū)Ψ降慕Y(jié)構(gòu)體變量。(4)結(jié)構(gòu)體指針的運算原則同一般指針一樣。例如:結(jié)構(gòu)體指針的加1或減1運算(加、減整型常量),其含義是將指針指向下一個或上一個結(jié)構(gòu)體變量。9.4.3通過結(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是一個指針,*p.y是取該指針的目標。意義同上。等效為++(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)體成員的引用及計算時應(yīng)注意它們使用的區(qū)別C語言計算中運算符“.”、“->”、“()”、“[]”的優(yōu)先級最高。(*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ù)運行程序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ù)運行程序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ù)間不僅可以傳遞簡單變量、數(shù)組、指針等類型的變量,而且還可以傳遞結(jié)構(gòu)體類型的變量。函數(shù)之間結(jié)構(gòu)體變量的傳遞同一般變量一樣,可以用數(shù)據(jù)復(fù)制方式傳遞,也可以用地址復(fù)制方式傳遞。9.5.1結(jié)構(gòu)體變量的傳遞用復(fù)制方式傳遞結(jié)構(gòu)體變量時,可以把結(jié)構(gòu)體變量作為普通變量來處理。例如兩個類型相同的結(jié)構(gòu)體變量之間可以進行賦值,可以把一個結(jié)構(gòu)體變量作為一個參數(shù)以復(fù)制方式傳遞給被調(diào)用函數(shù),函數(shù)也可以返回一個結(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)用時把結(jié)構(gòu)體變量teacher作為實參傳遞給被調(diào)用函數(shù)的形參p。實參、形參具有相同的結(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);}程序運行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)體變量的說明pteacher1.調(diào)用函數(shù)display:調(diào)用時把結(jié)構(gòu)體變量teacher作為實參傳遞給被調(diào)用函數(shù)的形參p。實參、形參具有相同的結(jié)構(gòu)體類型。P接收調(diào)用時傳遞給被調(diào)用函數(shù)的數(shù)據(jù)。2.結(jié)構(gòu)體變量p和teacher在運行時占用互不相同的存儲空間。在傳遞參數(shù)時,把teacher的各個成員的值復(fù)制給p的各個成員。3.形參和實參代表兩個不同的結(jié)構(gòu)體變量,其結(jié)構(gòu)體類型相同,但運行時分配不同的存儲空間。但被調(diào)用函數(shù)不能修改實參所對應(yīng)的結(jié)構(gòu)體變量。9.5結(jié)構(gòu)體在函數(shù)間的傳遞9.5.1結(jié)構(gòu)體變量的傳遞采用地址復(fù)制方式傳遞結(jié)構(gòu)體變量時,實參是結(jié)構(gòu)體變量的地址,形參是與實參有相同結(jié)構(gòu)體類型的指針,該指針用來接收傳遞的結(jié)構(gòu)體變量首地址。被調(diào)用函數(shù)通過該指針來處理實參所對應(yīng)的結(jié)構(gòu)體變量的各成員。用地址復(fù)制方式傳遞結(jié)構(gòu)體變量是常用的傳遞方式。所以,利用地址復(fù)制方式傳遞結(jié)構(gòu)體變量時,被調(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ù)的形參為指針變量,接收實參的結(jié)構(gòu)體變量的地址,指針指向結(jié)構(gòu)體變量ymd.*/190 structdate*pd;200 {pd->year=2002;210 }程序運行Enteryear-month-day:2001,9,1,zhang<CR>2001,9,1,zhang2002,9,1,zhang例9.7的說明:在調(diào)用day()函數(shù)時,其實參是結(jié)構(gòu)體變量的首地址&ymd。day()函數(shù)的定義中,形參pd是與實參具有相同結(jié)構(gòu)體類型的指針變量,該指針變量接收傳遞過來的實參地址,即結(jié)構(gòu)體變量ymd的首地址。函數(shù)通過pd訪問結(jié)構(gòu)體變量ymd,并可修改其成員值,例如:pd->year=2002將ymd變量的year值改為2002。9.5.2結(jié)構(gòu)體數(shù)組在函數(shù)間的傳遞例9-8的說明:主函數(shù)main()定義的結(jié)構(gòu)體數(shù)組list[],用于存放學(xué)生的成績冊。函數(shù)調(diào)用input(&list[i])中的實參是結(jié)構(gòu)體數(shù)組list[i]的首地址。input()函數(shù)用于建立該成績冊,用于輸入一個學(xué)生的有關(guān)信息;其形參sp是一個structstudent結(jié)構(gòu)體類型的指針,用于接收結(jié)構(gòu)體數(shù)組(元素)的首地址。display()函數(shù)用于顯示學(xué)生的成績冊。函數(shù)調(diào)用display(list,i)中的實參list是結(jié)構(gòu)體數(shù)組名,i是輸入第幾個學(xué)生的數(shù)。display()函數(shù)調(diào)用時,其形參pm是structstudent結(jié)構(gòu)體類型的指針,用于接收結(jié)構(gòu)體數(shù)組(元素〕的首地址。函數(shù)不僅可以傳遞一般結(jié)構(gòu)體變量,而且還可以傳遞結(jié)構(gòu)體數(shù)組。在傳遞結(jié)構(gòu)體數(shù)組時,實參是數(shù)組名,即結(jié)構(gòu)體數(shù)組的地址;形參是結(jié)構(gòu)體指針,它接收傳遞過來的數(shù)組首地址,使它指向?qū)崊⑺硎镜慕Y(jié)構(gòu)體數(shù)組。例9-8學(xué)生成績冊的建立和顯示。采用結(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ù)說明的一般形式:9.6.1

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

結(jié)構(gòu)體名函數(shù)名([形參表])[形參說明;]{內(nèi)部數(shù)據(jù)說明語句;執(zhí)行語句;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ù)的說明程序運行CallFunctiontest.str[]=teststringtest.x=45test.y=147.45Afterreturnrev.str[]=teststringrev.x=45rev.y=147.45調(diào)用函數(shù)例9-9的說明:函數(shù)func()被定義為結(jié)構(gòu)體型函數(shù),其類型為struct

datatype

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

datatype類型的結(jié)構(gòu)體變量,它與func()的類型相同,用rev接收函數(shù)func()的返回值。從運行結(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ù)時,用于接收結(jié)構(gòu)體指針型函數(shù)返回值的變量應(yīng)該是指向與該函數(shù)具有相同結(jié)構(gòu)體類型的結(jié)構(gòu)體指針變量。當(dāng)函數(shù)的返回值是結(jié)構(gòu)體變量的首地址時,稱該函數(shù)為結(jié)構(gòu)體指針型函數(shù),該函數(shù)的數(shù)據(jù)類型為結(jié)構(gòu)體指針型。結(jié)構(gòu)體指針型函數(shù)定義形式:struct

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

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

結(jié)構(gòu)體名*函數(shù)名();例9-10實現(xiàn)電話號碼查尋。假設(shè)有一個電話號碼表,給一個電話號碼找出該號碼對應(yīng)的信息。函數(shù)功能:建立電話號碼表函數(shù)當(dāng)輸入的電話號碼為0時,結(jié)束電話號碼的輸入。(if語句中判斷條件為真,break強制程序退出循環(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ù)給出的電話號碼查著對應(yīng)的信息。輸入查找的電話號碼為0,則退出程序。(if語句中判斷條件為真,break強制程序結(jié)束)。函數(shù)返回值是結(jié)構(gòu)體變量list[i]的首地址結(jié)構(gòu)體指針的說明調(diào)用結(jié)構(gòu)體指針型函數(shù)注意:結(jié)構(gòu)體指針型函數(shù)返回結(jié)構(gòu)體首地址,但該結(jié)構(gòu)體一定不能是該函數(shù)中定義的自動型結(jié)構(gòu)體變量。9.7共用體簡介9.7.1共用體的說明

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論