結(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è),還剩48頁(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)介

結(jié)構(gòu)體和共用體第一頁(yè),共五十三頁(yè),2022年,8月28日結(jié)構(gòu)體(structure)是一種數(shù)據(jù)類型,它把互相聯(lián)系的數(shù)據(jù)組合成一個(gè)整體。例、第二頁(yè),共五十三頁(yè),2022年,8月28日一個(gè)學(xué)生的學(xué)號(hào)、姓名、性別、年齡、成績(jī)、地址,是互相聯(lián)系的數(shù)據(jù),在C語(yǔ)言中用“結(jié)構(gòu)體(structure)”來(lái)定義。structstudent

{

int

num;

/*學(xué)號(hào)*/

char

name[20];

/*姓名*/

char

sex;

/*性別*/

int

age;

/*年齡*/

float

score;

/*成績(jī)*/

char

addr[30];

/*地址*/

};

第三頁(yè),共五十三頁(yè),2022年,8月28日§11.2結(jié)構(gòu)體變量的定義結(jié)構(gòu)體是一種數(shù)據(jù)類型(像int、char、flaot數(shù)據(jù)類型一樣),可以用它定義變量。

用結(jié)構(gòu)體類型定義變量的方式有三種:第四頁(yè),共五十三頁(yè),2022年,8月28日一、先定義結(jié)構(gòu)體類型,再定義變量例、structstudent

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

};structstudentstudent1,student2;

第五頁(yè),共五十三頁(yè),2022年,8月28日結(jié)構(gòu)體變量中的各成員,在內(nèi)存中順序存放。結(jié)構(gòu)體變量所占內(nèi)存大小用運(yùn)算符sizeof計(jì)算。例、printf("%d%d\n",sizeof(structstudent),sizeof(student1));第六頁(yè),共五十三頁(yè),2022年,8月28日為了方便,可以這樣定義結(jié)構(gòu)體變量:#defineSTUDENTstructstudentSTUDENT

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

};STUDENTstudent1,student2;第七頁(yè),共五十三頁(yè),2022年,8月28日二、在定義類型的同時(shí)定義變量structstudent

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

}student1,student2;第八頁(yè),共五十三頁(yè),2022年,8月28日三、直接定義變量struct

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

}student1,student2;第九頁(yè),共五十三頁(yè),2022年,8月28日四、成員是另一個(gè)結(jié)構(gòu)體變量structdate

intmonth;

intday;

intyear;

};structstudent

{

int

num;

char

name[20];

char

sex;

int

age;

structdatebirthday;

char

addr[30];

}student1,student2;

第十頁(yè),共五十三頁(yè),2022年,8月28日第十一頁(yè),共五十三頁(yè),2022年,8月28日§11.3結(jié)構(gòu)體變量的引用1、一般情況下,不能將一個(gè)結(jié)構(gòu)體變量作為整體來(lái)引用,只能引用其中的成員(分量)。引用結(jié)構(gòu)體成員的方式:

結(jié)構(gòu)體變量名.成員名.是“成員運(yùn)算符”

例1、

printf("%d,%s,%c,%d,%f,%s",student1.num,,student1.sex,

student1.age,student1.score,sutdent1.addr);

printf("%d,%s,%c,%d,%f,%s",student1);第十二頁(yè),共五十三頁(yè),2022年,8月28日例2、

student2.score=student1.score;

sum=student1.score+student2.score;

student1.age++;

++student1.age;例3、

scanf("%d",&student1.num);第十三頁(yè),共五十三頁(yè),2022年,8月28日2、當(dāng)成員是另一個(gè)結(jié)構(gòu)體變量時(shí),應(yīng)一級(jí)一級(jí)地引用成員。例4、

student1.num;

;

student1.birthday.month;

student1.birthday.day;

student1.birthday.year;第十四頁(yè),共五十三頁(yè),2022年,8月28日3、僅在以下兩種情況下,可以把結(jié)構(gòu)體變量作為一個(gè)整體來(lái)訪問(wèn)。(1)結(jié)構(gòu)體變量整體賦值,例、

student2=student1;(2)取結(jié)構(gòu)體變量地址,例、

printf("%x",&student1);

返回本章目錄第十五頁(yè),共五十三頁(yè),2022年,8月28日§11.4結(jié)構(gòu)體變量的初始化structstudent

{

longintnum;

char

name[20];

char

sex;

char

addr[20];}a={89031,"LiLin",'M',"123BeijingRoad"};注意:不能在結(jié)構(gòu)體內(nèi)賦初值。例、structstudent

{

longintnum=89031;

char

name[20]="LiLin";

char

sex='M';

char

addr[30]="123BejingRoad";

}a;第十六頁(yè),共五十三頁(yè),2022年,8月28日§11.5結(jié)構(gòu)體數(shù)組一、結(jié)構(gòu)體數(shù)組的定義

structstudent

{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];

};

structstudentstu[3];

第十七頁(yè),共五十三頁(yè),2022年,8月28日第十八頁(yè),共五十三頁(yè),2022年,8月28日二、結(jié)構(gòu)體數(shù)組的初始化(見(jiàn)課本P266)

structstudent

{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];

}stu[3]={

{10101,"LiLin",

'M',18,87.5,"103BejingRoad"},

{10102,"ZhangFun",'M',19,99,

"130ShanghaiRoaad"},

{10104,"WangMin",'F',20,78.5,"1010ZhongshanRoad"}};第十九頁(yè),共五十三頁(yè),2022年,8月28日三、舉例[例11.2]對(duì)候選人得票的統(tǒng)計(jì)程序。設(shè)有三個(gè)候選人,每次輸入一個(gè)得票的候選人的名字,要求最后輸出各候選人得票結(jié)果。運(yùn)行第二十頁(yè),共五十三頁(yè),2022年,8月28日§11.6結(jié)構(gòu)體指針一、結(jié)構(gòu)體指針結(jié)構(gòu)體指針:指向結(jié)構(gòu)體變量的指針。例、第二十一頁(yè),共五十三頁(yè),2022年,8月28日structstudent

{

longintnnum;

char

name[20];

char

sex;

float

score;

};

structstudentstu_1;

structstudent*p;

p=&stu_1;第二十二頁(yè),共五十三頁(yè),2022年,8月28日結(jié)構(gòu)體指針,通過(guò)指向運(yùn)算符->引用結(jié)構(gòu)體中的成員。例、

p->num

p->name

p->sex

p->score因此結(jié)構(gòu)體成員的引用方式有以下三種:

結(jié)構(gòu)體變量.成員名

(*p).成員名

p->成員名第二十三頁(yè),共五十三頁(yè),2022年,8月28日三、指向結(jié)構(gòu)體數(shù)組的指針例1:

structstudentstu[3];

structstudent*p=stu;

p++;p++;

第二十四頁(yè),共五十三頁(yè),2022年,8月28日

structstudentstu[3];

structstudent*p;p=stu;

p->num;

p++;

p->num;

p++;

p->num;

第二十五頁(yè),共五十三頁(yè),2022年,8月28日三、用結(jié)構(gòu)指針作函數(shù)的參數(shù)[例11.5]有一個(gè)結(jié)構(gòu)體變量stu,內(nèi)含學(xué)生學(xué)號(hào)、姓名和三門(mén)課程的成績(jī)。要求在main中賦初值,在函數(shù)print中打印輸出。運(yùn)行第二十六頁(yè),共五十三頁(yè),2022年,8月28日說(shuō)明:1、結(jié)構(gòu)體的成員作函數(shù)的參數(shù)。與普通變量作函數(shù)參數(shù)的用法相同。值傳送,不能修改實(shí)參的值。2、結(jié)構(gòu)體指針作函數(shù)的參數(shù)。將結(jié)構(gòu)體的地址傳送給函數(shù),效率高,可以修改實(shí)參的值。3、結(jié)構(gòu)體作函數(shù)的參數(shù)。將結(jié)構(gòu)體的全部成員值傳送給函數(shù),效率低,不能修改實(shí)參的值。第二十七頁(yè),共五十三頁(yè),2022年,8月28日四、舉例

[例11.6]有4個(gè)學(xué)生,每個(gè)學(xué)生包括學(xué)號(hào)、姓名和成績(jī)。要求找出成績(jī)最高者的姓名和成績(jī)。

返回本章目錄運(yùn)行第二十八頁(yè),共五十三頁(yè),2022年,8月28日§11.8共用體一、共用體的概念當(dāng)需要把不同類型的變量存放到同一段內(nèi)存單元,或?qū)ν欢蝺?nèi)存單元的數(shù)據(jù)按不同類型處理,則需要使用“共用體”數(shù)據(jù)結(jié)構(gòu)。例、把一個(gè)整型變量、一個(gè)字符型變量、一個(gè)實(shí)型變量放在同一個(gè)地址開(kāi)始的內(nèi)存單元中。共用體的定義形式:

union共用體名

成員列表;

}變量列表;例、第二十九頁(yè),共五十三頁(yè),2022年,8月28日uniondata

{

inti;

charch;

floatf;

}第三十頁(yè),共五十三頁(yè),2022年,8月28日注意區(qū)分:“共用體”:各成員占相同的起始地址,所占內(nèi)存長(zhǎng)度等于最長(zhǎng)的成員所占內(nèi)存。“結(jié)構(gòu)體”:各成員占不同的地址,所占內(nèi)存長(zhǎng)度等于全部成員所占內(nèi)存之和。第三十一頁(yè),共五十三頁(yè),2022年,8月28日二、共用體變量的引用只能引用共用體變量的成員,如、

uniondataa;

a.i;

a.ch;

a.f;第三十二頁(yè),共五十三頁(yè),2022年,8月28日三、共用體類型數(shù)據(jù)的特點(diǎn)1、共用體變量中的值是最后一次存放的成員的值,如:

a.i=1;

a.ch='a';

a.f=1.5;

完成以上三個(gè)賦值語(yǔ)句后,共用體變量的值是1.5,而a.i=1和a.ch=‘a(chǎn)’已無(wú)意義。第三十三頁(yè),共五十三頁(yè),2022年,8月28日2、共用體變量不能初始化,例、

uniondata

{

inti;

charch;

floatf;

}a={1,'a',1.5};第三十四頁(yè),共五十三頁(yè),2022年,8月28日

[例11.11]設(shè)有若干個(gè)人員的數(shù)據(jù),其中有學(xué)生和教師。學(xué)生數(shù)據(jù)包括:姓名、號(hào)碼、性別、職業(yè)、班級(jí)。教師數(shù)據(jù)包括:姓名、號(hào)碼、性別、職業(yè)、職務(wù)。如圖、

分析:學(xué)生數(shù)據(jù)的class(班級(jí))和教師數(shù)據(jù)的position(職務(wù))類型不同,但在同一表格中,使用“共用體”數(shù)據(jù)結(jié)構(gòu)。運(yùn)行第三十五頁(yè),共五十三頁(yè),2022年,8月28日§11.9枚舉類型如果一個(gè)變量只有幾種可能的值,可以定義為枚舉類型。

“枚舉”:將變量可能的值一一列舉出來(lái)。變量的值只能取列舉出來(lái)的值之一。第三十六頁(yè),共五十三頁(yè),2022年,8月28日用關(guān)鍵字enum定義枚舉類型:例、enumweekday{sun,mon,tue,wed,thu,fri,sat};weekday是枚舉類型名,可以用于定義變量,如、enumweekdayworkday,week_end;

weekday=mon;

week_end=sun;sun、mon、....、sat稱為“枚舉元素”或“枚舉常量”。第三十七頁(yè),共五十三頁(yè),2022年,8月28日說(shuō)明:1、枚舉元素是常量。在C編譯器中,按定義的順序取值0、1、2、...。

例、

weekday=mon;

printf("%d",weekday);輸出整數(shù)1。2、枚舉元素是常量,不是變量,因此不能賦值。

sun=0;mon=1;但在定義枚舉類型時(shí),可以指定枚舉常量的值,如、

enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};此時(shí),tue、wed、...的值從mon的值順序加1。如,tue=2。第三十八頁(yè),共五十三頁(yè),2022年,8月28日3、枚舉值可以作判斷,例、

if(weekday==mon)....

if(weekday>sun)....4、整型與枚舉類型是不同的數(shù)據(jù)類型,不能直接賦值,如、

workday=2;/*workday是枚舉類型*/但可以通過(guò)強(qiáng)制類型轉(zhuǎn)換賦值,如、

workday=(enumweekday)2;第三十九頁(yè),共五十三頁(yè),2022年,8月28日[例11.12]口袋里有紅、黃、藍(lán)、白、黑五種顏色的球若干個(gè)。每次從口袋中取出三個(gè)球,打印出三種不同顏色球的可能取法。

分析:球的顏色只可能取五種值,用枚舉類型變量處理。

運(yùn)行第四十頁(yè),共五十三頁(yè),2022年,8月28日§11.10用typedef定義類型一、概念關(guān)鍵字typedef用于定義一種新的數(shù)據(jù)類型,它代表已有數(shù)據(jù)類型,是已有數(shù)據(jù)類型的別名。例、

typedefintINTEGER;

typedeffloatREAL;

定義新數(shù)據(jù)類型INTEGER,它代表已有數(shù)據(jù)類型int。

定義新數(shù)據(jù)類型REAL,它代表已有數(shù)據(jù)類型float。通過(guò)上述定義后,以下兩行等價(jià):

int

i,j;floata,b;

INTEGERi,j;REAL

a,b;第四十一頁(yè),共五十三頁(yè),2022年,8月28日二、典型用法:1、定義一種新數(shù)據(jù)類型,專用于某種類型的變量,使程序更清晰明了。例1、typedefunsignedintsize_t

size_tsize;/*定義size為無(wú)符號(hào)整型變量*/例2、typedefintCOUNT

COUNTi,j;第四十二頁(yè),共五十三頁(yè),2022年,8月28日2、簡(jiǎn)化數(shù)據(jù)類型的書(shū)寫(xiě)。例3、typedefstruct

{

intmonth;

intday;

intyear;

}DATE;

DATEbirthday;

DATE*p;

DATEd[7];例4、typdefunsignedintUINT;

UINTi,j;第四十三頁(yè),共五十三頁(yè),2022年,8月28日三、定義新類型的更一般形式:(1)typedefintNUM[100];/*申明NUM為整型數(shù)組類型*/

NUMn;/*n為整型數(shù)組變量*/(2)typedefchar*STRING;/*申明STRING是字符指針類型*/

STRINGp,s[10];/*p是字符指針變量,s[10]是字符指針數(shù)組*/第四十四頁(yè),共五十三頁(yè),2022年,8月28日(3)typedefint(*POINTER)();

/*POINTER是指向函數(shù)的指針,該函數(shù)返回整型*/

POINTERp1,p2;/*定義p1,p2為指向函數(shù)的指針*/第四十五頁(yè),共五十三頁(yè),2022年,8月28日四、typedef與#define的區(qū)別

typedefintCOUNT

#defineCOUNTinttypedef定義一種新的數(shù)據(jù)類型(CO

溫馨提示

  • 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)論