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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

intage;charaddress[50];};10.2定義結構類型、變量的方法定義結構體變量通常:定義結構體類型用結構體類型定義結構體變量先定義結構類型、然后定義結構變量在定義結構類型的同時定義結構變量直接定義結構變量一、定義結構類型、定義結構變量定義結構類型:structstudent{

intnumber;charname[20];

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

intnumber;charname[20];

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

intnumber;charname[20];

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

intyear;

intmonth;

intday;};structworker{

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

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

student1.num=12345;

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

可以直接引用結構體成員的地址。

scanf(“%d”,&worker2.birthday.day);10.4結構體變量的初始化結構體變量和簡單變量一樣,根據(jù)定義的位置不同,有:外部、自動存儲類型。外部變量靜態(tài)存儲變量自動變量動態(tài)存儲變量同樣,結構體變量也有這些存儲類型。外部存儲類型的結構體變量直接進行初始化。例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)存儲類型的結構體變量進行初始化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結構體數(shù)組結構體數(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];結構體數(shù)組的初始化:structst{

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

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

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

p++

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

Lilin

Zhanghua

Wangpin

M

M

F181920

p++

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

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

等等。三、用指向結構體的指針作為函數(shù)的參數(shù)要把結構體變量的值由一個函數(shù)傳遞給另一個函數(shù)(標準C):

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

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

structstudent{

intnum;charname[20];floatscore;

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

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

void*型的指針,必須用強制類型轉換成對應的類型。10.8共用體一、共用體的概念在C語言中,一個變量一旦定義,便在內存中開辟一個獨立的單元來存放。但在實際使用中,有時需要把不同類型,如整型、實型、字符型存放在同一個內存單元中。這種使幾個不同的變量共同占用同一個內存單元的結構,叫“共用體”或“聯(lián)合體”。共用體的定義:共用體和結構體變量的定義類似,也可以分成三種方式: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地址共用體和結構體的區(qū)別:結構體變量所占用的內存是所有成員的長度之和。各個成員有其自己的內存。共用體所有的成員占用“同一”內存。所需的內存:最大成員的長度。二、共用體變量的引用共用體的引用:不能直接引用共用體變量,只能引用共用體變量中的成員。例如:a.i=9;/*引用變量a的整型部分*/a.ch=‘H’;/*引用變量a的字符型部分*/a.f=3.14;/*引用變量a的實型部分*/printf(“%d\n”,a.i);三、注意事項:同一個共用體變量每一瞬時只能保存一個成員,一個成員起作用。當保存一個成員的值,原先保存的值就丟失。各成員的起始地址一樣。共用體變量可以出現(xiàn)在結構體中,結構體也可以出現(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中,對枚舉元素按常量處理,也叫“枚舉常量”。如果不進行任何設定,第1個元素值為0,第2個為1,……也可以改變枚舉元素的值,如enumweekday{sun=7

溫馨提示

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

評論

0/150

提交評論