C語言程序設(shè)計:第十章 結(jié)構(gòu)體與共同體_第1頁
C語言程序設(shè)計:第十章 結(jié)構(gòu)體與共同體_第2頁
C語言程序設(shè)計:第十章 結(jié)構(gòu)體與共同體_第3頁
C語言程序設(shè)計:第十章 結(jié)構(gòu)體與共同體_第4頁
C語言程序設(shè)計:第十章 結(jié)構(gòu)體與共同體_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第十章結(jié)構(gòu)體與共同體現(xiàn)代教育技術(shù)中心2000年5月13日10.1概述迄今為止,我們介紹了簡單的數(shù)據(jù)類型:整形、實(shí)型、字符型以及數(shù)組指針類型定義的變量,其中,數(shù)組中各元素都具有相同的類型?,F(xiàn)在,我們要處理一個學(xué)生的數(shù)據(jù):Name,Age,Sex,Addressetc,如何處理?在數(shù)據(jù)庫中,我們通常要用“記錄”來描述一個實(shí)體:如學(xué)生、教材、……在C語言中,允許程序員自定義類型,這就是結(jié)構(gòu):structstud{

intnum;charname[20];charsex[2];

intage;charaddress[50];};10.2定義結(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)變量直接定義結(jié)構(gòu)變量一、定義結(jié)構(gòu)類型、定義結(jié)構(gòu)變量定義結(jié)構(gòu)類型:structstudent{

intnumber;charname[20];

intage;charsex[3];charaddress[50];};定義結(jié)構(gòu)類型的關(guān)鍵字定義的結(jié)構(gòu)類型名稱是一個C標(biāo)識符成員列表:域表,成員列表,根據(jù)需要而定。定義結(jié)構(gòu)類型、定義結(jié)構(gòu)變量用定義過的結(jié)構(gòu)類型名來定義結(jié)構(gòu)體變量。structstudentstudent1,student2,student3;關(guān)鍵字已經(jīng)定義過的類型名稱。結(jié)構(gòu)變量列表和我們直接使用的intfloatchar類似二、在定義結(jié)構(gòu)類型同時定義結(jié)構(gòu)變量C語言允許在定義結(jié)構(gòu)類型時,定義結(jié)構(gòu)變量。如structstudent{

intnumber;charname[20];

intage;charsex[3];charaddress[50];}student1,student2,student3;關(guān)鍵字結(jié)構(gòu)類型名稱結(jié)構(gòu)成員列表結(jié)構(gòu)變量列表三、直接定義結(jié)構(gòu)變量也可以不定義結(jié)構(gòu)類型,而直接定義結(jié)構(gòu)變量。struct{

intnumber;charname[20];

intage;charsex[3];charaddress[50];}student1,student2,student3;五、注意事項(xiàng)結(jié)構(gòu)類型名和結(jié)構(gòu)變量對結(jié)構(gòu)體的引用問題。結(jié)構(gòu)體中的成員和程序中的變量,代表不同的對象,因此可以同名。在結(jié)構(gòu)體中,成員可以是另一個已經(jīng)定義的結(jié)構(gòu)體類型變量。structdate{

intyear;

intmonth;

intday;};structworker{

intnum;charname[20];charsex[3];

structdatebirthday;charaddress[50];}worker1,worker2,worker3;為結(jié)構(gòu)體變量的成員。10.3結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用方式:結(jié)構(gòu)體變量.成員如:student1.numberscanf(“%d”,&student1.number);printf(“%d”,student2.number);對成員的引用,和簡單變量一樣,要注意其類型。scanf(“%d”,&student2.number);scanf(“%s”,);成員運(yùn)算符

student1.num=12345;

strcpy(student2.address,”XiamenCity”);注意:不能將結(jié)構(gòu)體變量整體輸入、輸出。printf(“%d,%s,%s,%d,%s\n”,student1);引用時,必須是基本類型(int、float、char)的成員,如果不是,應(yīng)繼續(xù)引用“成員運(yùn)算符”。如:worker1.birthday.year=1973;worker1.birthday.month=8;基本類型的成員可以象普通變量一樣進(jìn)行各種運(yùn)算。worker1.birthday.year++;--worker1.birthday.month;

可以直接引用結(jié)構(gòu)體成員的地址。

scanf(“%d”,&worker2.birthday.day);10.4結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量和簡單變量一樣,根據(jù)定義的位置不同,有:外部、自動存儲類型。外部變量靜態(tài)存儲變量自動變量動態(tài)存儲變量同樣,結(jié)構(gòu)體變量也有這些存儲類型。外部存儲類型的結(jié)構(gòu)體變量直接進(jìn)行初始化。例10.1structstudent{

intnum;charname[20];charsex;charaddress[40];}stu1={12345,”LiLin”,’M’,”123BejingRoad”};main(){printf(“No.:%d\nName:%s\nSex:%c\nAddress:%s\n”,stu1.num,,stu1.sex,stu1.address);}對靜態(tài)存儲類型的結(jié)構(gòu)體變量進(jìn)行初始化main(){staticstructstudent{

intnum;charname[20];charsex;charaddress[40];}stu1={12345,”LiLin”,’M’,”123BeijingRoad”};printf(“\tNo.:%d\n\tName:%s\n\tSex:%c\n\tAddress:%s\n”,stu1.num,,stu1.sex,stu1.address);}10.5結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組的定義:structst{

intnum;charname[20];charsex;floatscore;};structststudent1[10];structst{intnum;charname[20];charsex;floatscore;}student1[10];struct{intnum;charname[20];charsex;floatscore;}student1[10];結(jié)構(gòu)體數(shù)組的初始化:structst{

intnum;charname[20];charsex;floatscore;};staticstructststudent1[3]={{12345,”LiLin”,’M’,98},{12346,”ZhangHong”,’F’,70},{12347,”WangTing”,’M’,89}};

定義時進(jìn)行初始化,可以不給定元素個數(shù)。

ex10-0210.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針變量結(jié)構(gòu)體變量在內(nèi)存中也占據(jù)一定得空間,因此結(jié)構(gòu)體變量也有起始地址,這就是結(jié)構(gòu)體指針.可以定義一個指針變量來存放結(jié)構(gòu)體的起始地址--結(jié)構(gòu)體指針變量.我們知道:定義指針變量是有類型的,指向結(jié)構(gòu)體的指針變量必須定義成結(jié)構(gòu)體對應(yīng)的類型!一、指向結(jié)構(gòu)體變量的指針定義結(jié)構(gòu)體變量的指針變量的步驟:定義結(jié)構(gòu)體的類型定義結(jié)構(gòu)體變量、和指針變量對結(jié)構(gòu)體的指針變量進(jìn)行初始化用初始化的指針變量訪問結(jié)構(gòu)體變量。ex10-03使用指針變量引用結(jié)構(gòu)體的成員時,應(yīng)使用如下格式:由于成員運(yùn)算符比指針運(yùn)算符的優(yōu)先級更高,如果寫成:*p.num**p.sex*p.score則相當(dāng)于*(p.num)*()……,因此應(yīng)寫成:(*p).num(*p).name(*p).sex(*p).score為了簡化寫法,把上述寫成:p->nump->namep->sexp->score其中:“->”叫指向運(yùn)算符。ex10-031二、指向結(jié)構(gòu)體數(shù)組的指針前面已經(jīng)介紹結(jié)構(gòu)體指針和結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的元素可以用指針或指針變量來指向、進(jìn)行引用。ex10-04structstudent{

intnum;charname[20];charsex;intage;};structstudentstu[3]={{10101,”LiLin”,’M’,18},{10102,”Zhanghua”,’M’,19},{10103,”Wangpin”,’F’,20}};main(){structstudent*p;

printf(“No.NameSexAge\n”);for(p=stu;p<stu+3;p++)

printf(“%5d%-20s%2c,%4d”,p->num,p->name,p->sex,p->age);}注意:

p定義成結(jié)構(gòu)體student的指針變量,因此:

p++

指向的是結(jié)構(gòu)體數(shù)組的下一個元素,而不是結(jié)構(gòu)體的下一個成員。101011010210103

Lilin

Zhanghua

Wangpin

M

M

F181920

p++

p++由于定義的是指向結(jié)構(gòu)體的指針,因此它只能指向結(jié)構(gòu)體,而不能指向結(jié)構(gòu)體的成員。如p=&stu[0].age是錯誤的。如果一定要指向一個非結(jié)構(gòu)體數(shù)據(jù),則可以使用強(qiáng)制類型轉(zhuǎn)換。

p=(structstudent*)&stu[0].age;

等等。三、用指向結(jié)構(gòu)體的指針作為函數(shù)的參數(shù)要把結(jié)構(gòu)體變量的值由一個函數(shù)傳遞給另一個函數(shù)(標(biāo)準(zhǔn)C):

用結(jié)構(gòu)體的成員作為函數(shù)的參數(shù)。把結(jié)構(gòu)體成員的數(shù)值傳遞給形參。用指向結(jié)構(gòu)體變量的指針作為實(shí)參,將結(jié)構(gòu)體變量的地址傳遞給形參。ex10-0510.7鏈表所謂“鏈表”是一種自帶有指向本結(jié)構(gòu)體變量的成員的一種結(jié)構(gòu)體。

NULL可見:在鏈表中的每一節(jié),至少要包含一個指向下一節(jié)的指針。鏈表結(jié)構(gòu)體類型的定義例如:

structstudent{

intnum;charname[20];floatscore;

structstudent*np;}使用鏈表動態(tài)分配內(nèi)存函數(shù):

malloc(size)在內(nèi)存中分配一個大小為size的空間。calloc(n,size)在內(nèi)存中分配n個大小為size的空間。free(p)釋放有指針p指向的內(nèi)存空間。注意:malloc()和calloc()函數(shù)返回的是

void*型的指針,必須用強(qiáng)制類型轉(zhuǎn)換成對應(yīng)的類型。10.8共用體一、共用體的概念在C語言中,一個變量一旦定義,便在內(nèi)存中開辟一個獨(dú)立的單元來存放。但在實(shí)際使用中,有時需要把不同類型,如整型、實(shí)型、字符型存放在同一個內(nèi)存單元中。這種使幾個不同的變量共同占用同一個內(nèi)存單元的結(jié)構(gòu),叫“共用體”或“聯(lián)合體”。共用體的定義:共用體和結(jié)構(gòu)體變量的定義類似,也可以分成三種方式:union共用體類型名{成員列表}共用體變量列表;例如:

unionexdata{inti;charch;floatf;}a,b,c;或:

unionexdata{inti;charch;floatf;};unionexdataa,b,c;或:

union{inti;charch;floatf;}a,b,c;

i

ch

f1200地址共用體和結(jié)構(gòu)體的區(qū)別:結(jié)構(gòu)體變量所占用的內(nèi)存是所有成員的長度之和。各個成員有其自己的內(nèi)存。共用體所有的成員占用“同一”內(nèi)存。所需的內(nèi)存:最大成員的長度。二、共用體變量的引用共用體的引用:不能直接引用共用體變量,只能引用共用體變量中的成員。例如:a.i=9;/*引用變量a的整型部分*/a.ch=‘H’;/*引用變量a的字符型部分*/a.f=3.14;/*引用變量a的實(shí)型部分*/printf(“%d\n”,a.i);三、注意事項(xiàng):同一個共用體變量每一瞬時只能保存一個成員,一個成員起作用。當(dāng)保存一個成員的值,原先保存的值就丟失。各成員的起始地址一樣。共用體變量可以出現(xiàn)在結(jié)構(gòu)體中,結(jié)構(gòu)體也可以出現(xiàn)的共用體中。10.9枚舉類型所謂“枚舉”是指將變量的值一一列舉出來,變量只限于列舉出來的值中取值。枚舉類型定義:

enum枚舉類型{枚舉值列表};枚舉變量定義:

enum枚舉類型枚舉變量列表;例如:

enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayworkday,week_end;workday=mon;week_end=sat;定義了兩個枚舉型變量workday,week_end為枚舉變量賦值!說明:在C中,對枚舉元素按常量處理,也叫“枚舉常量”。如果不進(jìn)行任何設(shè)定,第1個元素值為0,第2個為1,……也可以改變枚舉元素的值,如enumweekday{sun=7

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論