《C語言程序設計》課件ch7_第1頁
《C語言程序設計》課件ch7_第2頁
《C語言程序設計》課件ch7_第3頁
《C語言程序設計》課件ch7_第4頁
《C語言程序設計》課件ch7_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章結(jié)構(gòu)體和共用體

在學生登記表中,要描述一個學生的基本情況,就需要記錄他的學號、姓名、年齡、性別、成績、家庭住址等信息,如圖7-1所示。這些信息的特點是數(shù)據(jù)類型各不相同,但是都與同一個實體相關聯(lián)。

學號

(長整型)姓名

(字符串)年齡

(整型)性別

(字符型)成績

(長整型)家庭住址

(字符串)圖7-1

學生基本情況7.2結(jié)構(gòu)體與結(jié)構(gòu)體類型變量

“結(jié)構(gòu)體”是一種構(gòu)造類型,是數(shù)目固定、類型相同或不同的若干有序變量組成的集合。組成結(jié)構(gòu)體的每個數(shù)據(jù)稱為結(jié)構(gòu)體的“成員”。7.2.1結(jié)構(gòu)體類型的聲明struct結(jié)構(gòu)體名{成員列表};structstudent{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];};/*分號不能少*/

7.2.1結(jié)構(gòu)體類型的聲明說明:(1)sturct是關鍵字,是結(jié)構(gòu)體類型必不可少的標識符。(2)結(jié)構(gòu)體的名字是用戶自己定義的標識符,與變量命名規(guī)則相同。(3)大括號“{}”中是組成該結(jié)構(gòu)體的數(shù)據(jù)項,或稱為結(jié)構(gòu)體類型中的成員。(4)結(jié)構(gòu)體成員的數(shù)據(jù)類型可以是簡單類型、數(shù)組、指針或已經(jīng)定義過的結(jié)構(gòu)體等。(5)整個定義以分號結(jié)束。7.2.2結(jié)構(gòu)體類型變量的定義定義方法有以下三種:(1)先聲明結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量。structstudent{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];};structstudentstu1,stu2;

/*struct不能少*/7.2.2結(jié)構(gòu)體類型變量的定義(2)在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。structstudent{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];}stu1,stu2;定義說明的一般形式為:struct結(jié)構(gòu)名{

結(jié)構(gòu)體成員表列}變量名表列;7.2.2結(jié)構(gòu)體類型變量的定義(3)直接定義結(jié)構(gòu)體類型變量,不出現(xiàn)結(jié)構(gòu)體名。struct{unsignedintnum;charname[20];charsex;intage;floatscore;charaddr[40];}stu1,stu2;定義說明的一般形式為:struct{

結(jié)構(gòu)體成員表列}變量名表列;/*注意這里沒有類型名*/7.2.2結(jié)構(gòu)體類型變量的定義說明:1)結(jié)構(gòu)體類型與結(jié)構(gòu)體變量的概念。只能對變量進行操作(賦值、存取或運算),而不能對一個結(jié)構(gòu)體類型進行操作。2)對結(jié)構(gòu)體中的成員可以單獨使用,它的作用與地位相當于普通變量。3)結(jié)構(gòu)體的成員也可以是一個結(jié)構(gòu)體變量,從而構(gòu)成嵌套結(jié)構(gòu)。4)結(jié)構(gòu)體中的成員名可以與程序中的變量名相同,但二者代表不同的對象。

7.2.3結(jié)構(gòu)體變量的初始化對結(jié)構(gòu)體變量可以在定義時初始化。structstudentstu1={20080512,"WenChuan",'m',18,89.5,"SiChuan"};7.2.4結(jié)構(gòu)體類型變量的引用

1.結(jié)構(gòu)體類型變量的引用格式:2.結(jié)構(gòu)體變量的引用規(guī)則:(1)不能將結(jié)構(gòu)體變量作為一個整體進行輸入和輸出。printf("%d,%s,%c,%d,%f,%s\n",stu1.num,,stu1.sex, stu1.age,stu1.score,stu1.addr);結(jié)構(gòu)體變量名.成員名(2)結(jié)構(gòu)體變量中各成員的使用方法與普通的簡單類型變量完全相同。

stu1.num=20080512="BeiChuan"stu1.age=18;stu1.score=stu2.scoresum=stu1.score+stu2.scorestu1.num++;7.3結(jié)構(gòu)體數(shù)組

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

結(jié)構(gòu)體數(shù)組的定義方法和結(jié)構(gòu)體類型變量類似,只需說明它為數(shù)組類型即可。(a)structstudent{intnum;charname[20];floatscore;}structstudentstudent1[45];(b)structstudent{intnum;charname[20];floatscore;}student1[45];(c)struct{intnum;charname[20];floatscore;}student1[45];7.3結(jié)構(gòu)體數(shù)組2.結(jié)構(gòu)體數(shù)組的初始化與其他類型的數(shù)組一樣,對結(jié)構(gòu)體數(shù)組可以初始化。structstudent{intnum;charname[20];floatscore;}a[2]={{1001,"Zhang",85},{1002,"Wang",86}};7.4.1指向結(jié)構(gòu)體變量的指針

1.指向結(jié)構(gòu)體變量的指針及其定義

C語言編譯器嚴格地按照順序為每個結(jié)構(gòu)體變量的成員遞增地分配存儲空間。

結(jié)構(gòu)體變量的指針就是這個結(jié)構(gòu)體變量所在存儲單元段的起始地址。2.使用指向結(jié)構(gòu)體變量的指針引用結(jié)構(gòu)體變量的成員結(jié)構(gòu)體變量訪問的一般形式為:(*結(jié)構(gòu)體指針變量).成員名或:結(jié)構(gòu)體指針變量->成員名例如:(*spoint).num或:spoint->num7.4.2指向結(jié)構(gòu)體數(shù)組的指針1)為結(jié)構(gòu)體數(shù)組中的元素分配一個連續(xù)的存儲空間。說明:2)當指針變量指向一個結(jié)構(gòu)體數(shù)組,這時結(jié)構(gòu)體指針變量的值是整個結(jié)構(gòu)體數(shù)組的首地址。(1)如果p=stu,表示指針p指向結(jié)構(gòu)體數(shù)組stu的第1個元素。stu+i和p+i均表示數(shù)組第i個元素的地址,stu+i和p+i與stu[i]意義相同。(2)如果指針變量p指向數(shù)組的某一個元素,則p++指向下一個元素。(3)一個結(jié)構(gòu)體指針變量雖然可以用來訪問結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)組元素的成員,但是,不能使它指向一個成員。錯誤的:p=&stu[0].num;7.4.3結(jié)構(gòu)體指針變量作為函數(shù)的參數(shù)

用法和普通變量作實參是一樣的,屬于“值傳遞”方式。應當注意實參與形參的類型保持一致。(2)結(jié)構(gòu)體變量作實參(1)用結(jié)構(gòu)體變量的成員作參數(shù)。

這種傳送方式要經(jīng)全部成員逐個傳送,特別是成員為數(shù)組時將會使傳送的時間和空間開銷很大,嚴重地降低了程序的效率。因此,一般較少采用這種方法。(3)用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作為實參,將結(jié)構(gòu)體變量(或數(shù)組)的地址傳給形參。

用指針變量作函數(shù)參數(shù)進行傳送,這時由實參傳向形參的只是地址,減少了時間和空間的開銷。7.4.4結(jié)構(gòu)體與函數(shù)的類型

結(jié)構(gòu)體除了可以作為函數(shù)的參數(shù)外,函數(shù)的返回值也可以是結(jié)構(gòu)體變量或是指向結(jié)構(gòu)體變量的指針。當函數(shù)的返回值是一個結(jié)構(gòu)體變量時,稱該函數(shù)為一個結(jié)構(gòu)體類型函數(shù),其一般形式為:struct結(jié)構(gòu)體名函數(shù)名(形參表){函數(shù)體}7.5鏈表7.5.1鏈表的概念

鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu),它是動態(tài)地進行存儲分配的一種結(jié)構(gòu)。

單向鏈表

7.5.2動態(tài)存儲分配

所謂動態(tài)鏈表,就是在程序運行過程中能從無到有地建立鏈表。

內(nèi)存管理函數(shù)(malloc、calloc和free為)有效利用內(nèi)存資源提供了手段。7.5.3鏈表的基本操作(1)建立鏈表。(2)查找與輸出鏈表中的數(shù)據(jù)。(3)在鏈表中插入一個結(jié)點。

(4)從鏈表中刪除一個結(jié)點。7.6共用體7.6.1共用體的概念和定義一般形式為:union共用體名

{共用體成員表列};共用體變量的定義也有三種形式。(2)在定義共用體類型的同時定義共用體變量。(1)先定義共用體類型,再定義共用體變量。(3)直接定義共用體類型的變量。例如:unionperdata{intclass;charoffice[10];};7.6.2共用體變量的引用一般引用形式為:注意以下幾點:(1)同一個內(nèi)存段可以用來存放幾種不同類型的成員,但在每一瞬間只能存放其中一種,而不是同時存放幾種。(2)共用體變量中起作用的成員是最后一次存放的成員,在存入一個新的成員后,原有的成員就失去了作用。(3)共用體變量的地址和它的各成員的地址都是同一地址。共用體變量名.成員名(4)不能對共用體變量名賦值,也不能企圖引用變量名來得到一個值,還不能在定義共用體變量時對它初始化。(5)不能把共用體變量作為函數(shù)參數(shù),也不能使函數(shù)帶回共用體變量,但可以使用指向共用體變量的指針。(6)共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。7.7枚舉類型7.7.1枚舉的定義與說明一般形式為:枚舉變量也可用不同的方式說明:(1)先定義后說明。(2)同時定義說明。(3)直接說明。enum枚舉類型名{枚舉值表列};

enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdaya,b,c;enumweekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;enum{sun,mon,tue,wed,thu,fri,sat}a,b,c;7.7.2枚舉類型變量的賦值與引用枚舉類型在使用中有以下規(guī)定:(1)C編譯時,對枚舉元素按常量處理,故稱為枚舉常量。它們不是變量,因此不能對它們賦值。(2)枚舉元素作為常量,它們是有值的,C語言按定義順序使它們的值為0,1,2,3,…。(3)枚舉值可以用來作比較運算。(4)一個枚舉變量的值只能是這幾個枚舉常量之一,可以將枚舉常量賦給一個枚舉變量,但不能將一個整數(shù)賦給一個枚舉變量。

(5)枚舉常量不是字符串,不能用下面方式輸出字符串"sun":printf("%s",sun);

如果想先檢查枚舉變量a的值,如果是sun,就輸出“sun”。if(a==sun)printf("sun")

7.8用typedef定義類型可以給已經(jīng)存在的系統(tǒng)類型或用戶構(gòu)造的類型重新命名。常用的用戶定義類型主要有三種應用:

溫馨提示

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

評論

0/150

提交評論