




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
結(jié)構(gòu)體與共用體結(jié)構(gòu)體類型與結(jié)構(gòu)體變量7.1結(jié)構(gòu)體數(shù)組7.2結(jié)構(gòu)體與函數(shù)7.3動態(tài)數(shù)據(jù)結(jié)構(gòu)7.4共用體7.57.1結(jié)構(gòu)體類型與結(jié)構(gòu)體變量
在學(xué)生登記表中每個學(xué)生都有相同的信息如學(xué)生姓名、學(xué)號、年齡、性別、所在班級、各科成績等,如果將這些數(shù)據(jù)類型不同的信息單獨定義成相互獨立的變量分開處理則很難反映出它們之間的內(nèi)在聯(lián)系。在程序中如何將這些信息組織在一起,使得對它們的訪問和操作同步呢?7.1.1結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型定義的語法形式如下:struct結(jié)構(gòu)體標(biāo)識符{成員變量列表;…};其中struct為系統(tǒng)關(guān)鍵字(keyword),說明當(dāng)前定義一個新的結(jié)構(gòu)體類型。結(jié)構(gòu)體標(biāo)識符遵循C語言標(biāo)識符命名規(guī)則。在{}之間通過分號分割的變量列表稱為成員變量(structuremember),用于描述此類事物的某一方面特性。成員變量可以為基本數(shù)據(jù)類型(如float)、數(shù)組和指針類型,也可以為結(jié)構(gòu)體。由于不同的成員變量分別描述事物某一方面的特性,因此成員變量不能重名。例如,為了描述班級(假設(shè)僅僅包括班級編號、專業(yè)、人數(shù)等信息),可以定義如下的結(jié)構(gòu)體,structClass{charcode[10];/*編號*/charmajor[30];/*專業(yè)*/unsignedintcount;/*人數(shù)*/};7.1.1結(jié)構(gòu)體類型的定義7.1.2結(jié)構(gòu)體變量的定義與初始化定義結(jié)構(gòu)體類型變量有如下三種方法。1.定義結(jié)構(gòu)體類型后定義變量在上面定義了一個結(jié)構(gòu)體類型structstudent之后,可以用它定義變量,以便存儲一個具體的學(xué)生,例如:structstudentstud;以上定義了stud是structstudent結(jié)構(gòu)體類型的變量,student是結(jié)構(gòu)體名,不能省略。2.定義結(jié)構(gòu)體類型同時定義變量在定義結(jié)構(gòu)體類型的同時,定義結(jié)構(gòu)體類型變量。此方法的語法形式如下:struct結(jié)構(gòu)體標(biāo)識符{成員變量列表;…}變量1,變量2…,變量n;其中變量1,變量2…,變量n為變量列表,遵循變量的定義規(guī)則,彼此之間通過逗號分割。提示:在實際的應(yīng)用中,定義結(jié)構(gòu)體同時定義結(jié)構(gòu)體變量適合于定義局部使用的結(jié)構(gòu)體類型或結(jié)構(gòu)體類型變量,例如在一個文件內(nèi)部或函數(shù)內(nèi)部。7.1.2結(jié)構(gòu)體變量的定義與初始化3.直接定義變量此種方法在定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體類型的變量,但是不給出結(jié)構(gòu)體標(biāo)識符。此方法的語法形式如下:struct{成員變量列表;…}變量1,變量2…,變量n;其實質(zhì)是定義具有如下:struct{成員變量列表;…}類型的匿名結(jié)構(gòu)體之后,再定義相應(yīng)的變量。由于此結(jié)構(gòu)體沒有標(biāo)識符,所以無法采用定義結(jié)構(gòu)體變量的第一種方法來定義變量。提示:在實際的應(yīng)用中,此方法適合于臨時定義局部變量或結(jié)構(gòu)體成員變量。7.1.2結(jié)構(gòu)體變量的定義與初始化關(guān)于結(jié)構(gòu)體類型,有幾點要特別說明:(1)類型和變量是不同的概念,如以上定義的structstudent是結(jié)構(gòu)體類型名,它與int、char等一樣是類型名。編譯時,對類型不分配內(nèi)存空間,只對變量分配內(nèi)存空間。7.1.2結(jié)構(gòu)體變量的定義與初始化(2)成員也可以是其它結(jié)構(gòu)體類型的變量例如:structdate{intmonth;intday;intyear;
};structstudent{longnumber;charname[10];charsex;structdatebirthday;/*出生日期*/intscore[3];}stud1,stud2;首先說明了structdate類型,包含3個成員:month(月)、day(日)、year(年份)。然后在說明structstudent類型時,將成員birthday定義成structdate類型。7.1.2結(jié)構(gòu)體變量的定義與初始化(3)結(jié)構(gòu)體中的成員可以和程序中的變量同名,但二者不表示同一對象。例如程序中可以定義一個變量name,它與structstudent中name成員是不同的,互不干擾。7.1.2結(jié)構(gòu)體變量的定義與初始化4.結(jié)構(gòu)體變量的初始化具體的形式如下:struct結(jié)構(gòu)體標(biāo)識符{成員變量列表;…};Struct結(jié)構(gòu)體標(biāo)識符變量名={初始化值1,初始化值2,…,初始化值n};7.1.2結(jié)構(gòu)體變量的定義與初始化7.1.3結(jié)構(gòu)體變量的引用1.對結(jié)構(gòu)體變量中成員的引用結(jié)構(gòu)體成員的引用形式如下:結(jié)構(gòu)體變量名.成員名“.”是成員運算符,它在所有運算符中優(yōu)先級別最高。所以在程序中任何地方“結(jié)構(gòu)體變量名.成員名”出現(xiàn)都是一個整體?!纠?.1】
結(jié)構(gòu)體變量成員的引用示例。2.對整個結(jié)構(gòu)體變量的引用(1)相同類型的結(jié)構(gòu)體變量可以相互賦值例如:structstudentstud1,stud2;stud1=stud2就是合法的賦值表達式,它可以將結(jié)構(gòu)類型變量stud2的全部內(nèi)容賦給另一個結(jié)構(gòu)類型變量stud1,而不必逐個成員地多次賦值。7.1.3結(jié)構(gòu)體變量的引用(2)結(jié)構(gòu)體變量可以取地址例如:structstudentstud;&stud是合法的表達式,結(jié)果是結(jié)構(gòu)體變量stud的地址。7.1.3結(jié)構(gòu)體變量的引用(3)不能將一個結(jié)構(gòu)體變量作為一個整體進行輸入輸出例如:struct{intx;inty;}a;a.x=4;a.y=5;以下引用是錯誤的:printf(“%d,%d\n”,a);只能對結(jié)構(gòu)體變量的各個成員分別進行輸入輸出。對結(jié)構(gòu)體成員的操作和同類型變量的操作相同?!纠?.2】輸入3個同學(xué)的姓名、數(shù)學(xué)成績、英語成績和物理成績,確定總分最高的同學(xué),并打印其姓名及其三門課程的成績。7.1.3結(jié)構(gòu)體變量的引用7.1.4指向結(jié)構(gòu)體變量的指針1.結(jié)構(gòu)體指針變量的定義結(jié)構(gòu)體指針變量的一般形式定義如下:形式1:
struct結(jié)構(gòu)體標(biāo)識符{成員變量列表;…};struct結(jié)構(gòu)體標(biāo)識符*指針變量名;形式2:struct結(jié)構(gòu)體標(biāo)識符{成員變量列表;…}*指針變量名;形式3:struct{成員變量列表;…}*指針變量名;其中“指針變量名”為結(jié)構(gòu)體指針變量的名稱。形式1是先定義結(jié)構(gòu)體,然后再定義此類型的結(jié)構(gòu)體指針變量;形式2和形式3是在定義結(jié)構(gòu)體的同時定義此類型的結(jié)構(gòu)體指針變量。7.1.3結(jié)構(gòu)體變量的引用2.結(jié)構(gòu)體指針變量的初始化結(jié)構(gòu)體指針變量在使用前必須進行初始化,其初始化的方式與基本數(shù)據(jù)類型指針變量的初始化相同,在定義的同時賦予其一結(jié)構(gòu)體變量的地址。例如structPointoPoint={0,0,0};structPointpPoints=&oPoint;/*定義的同時初始化*/在實際應(yīng)用過程中,可以不對其進行初始化,但是在使用前必須通過賦值表達式賦予其有效的地址值。例如:structPointoPoint={0,0,0};structPoint*pPoints2;pPoints2=&oPoint;/*通過賦值表達式*/7.1.3結(jié)構(gòu)體變量的引用3.通過結(jié)構(gòu)體的指針引用結(jié)構(gòu)體的成員通過結(jié)構(gòu)體的指針引用結(jié)構(gòu)體的成員有兩種方法:一種通過間接訪問算符“*”;另一種通過成員選擇運算符。(1)使用間接訪問算符“*”引用結(jié)構(gòu)體成員基本引用形式是:(*結(jié)構(gòu)體的指針)·成員名7.1.3結(jié)構(gòu)體變量的引用(2)使用成員選擇運算符“->”C語言中為了使用方便和直觀,用成員選擇運算符“->”簡化結(jié)構(gòu)體成員的指針引用形式,成員選擇運算符又稱為箭頭操作符(arrowoperator),由減號和大于號拼接而成。使用成員選擇運算符引用結(jié)構(gòu)體成員的形式為:結(jié)構(gòu)體的指針->成員名7.1.3結(jié)構(gòu)體變量的引用7.1.5關(guān)鍵字typedef的用法typedef的一般使用形式如下:typedef原類型名新類型名;如:typedefstruct{ intyear; intmonth; intday;}DATE;定義新的類型名DATE,它表示上面指定的結(jié)構(gòu)體類型。在使用typedef時,應(yīng)當(dāng)注意如下的問題:(1)typedef的目的是為已知數(shù)據(jù)類型增加一個新的名稱。因此并沒有引入新的數(shù)據(jù)類型。(2)typedef只適于類型名稱定義,不適合變量的定義。(3)typedef與#define具有相似的之處,但是實質(zhì)不同。7.1.5關(guān)鍵字typedef的用法7.2結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組是以同類型的結(jié)構(gòu)體變量為數(shù)組元素的數(shù)組。通常一個結(jié)構(gòu)體變量可以存放一個整體的數(shù)據(jù)(如一個學(xué)生的數(shù)據(jù)),而需要存放多個整體的數(shù)據(jù)(如多個學(xué)生的數(shù)據(jù)),則應(yīng)當(dāng)采用結(jié)構(gòu)體數(shù)組,這是最常見的用法之一。7.2.1結(jié)構(gòu)體數(shù)組的定義方式1:struct結(jié)構(gòu)體標(biāo)識符{成員變量列表;…};struct結(jié)構(gòu)體標(biāo)識符數(shù)組名[數(shù)組長度];方式2:struct結(jié)構(gòu)體標(biāo)識符{成員變量列表;…}數(shù)組名[數(shù)組長度];7.2.1結(jié)構(gòu)體數(shù)組的定義方式3:struct{成員變量列表;…}數(shù)組名[數(shù)組長度];7.2.1結(jié)構(gòu)體數(shù)組的定義對于數(shù)組的引用,分為數(shù)組元素和數(shù)組本身的引用。對于數(shù)組元素的引用,其實質(zhì)為簡單變量的引用。對于數(shù)組本身的引用實質(zhì)是數(shù)組首地址的引用。7.2.1結(jié)構(gòu)體數(shù)組的定義1.?dāng)?shù)組元素的引用數(shù)組元素引用的語法形式如下:數(shù)組名[數(shù)組下標(biāo)];[]為下標(biāo)運算符;數(shù)組下標(biāo)的取值范圍為(0,1,2,...,n-1),n為數(shù)組長度。7.2.1結(jié)構(gòu)體數(shù)組的定義2.?dāng)?shù)組的引用數(shù)組作為一個整體的引用,一般表現(xiàn)在如下兩個方面:(1)作為一塊連續(xù)存儲單元的起始地址與結(jié)構(gòu)體指針變量配合使用;(2)作為函數(shù)參數(shù)。7.2.1結(jié)構(gòu)體數(shù)組的定義7.2.2結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化遵循基本數(shù)據(jù)類型數(shù)組的初始化規(guī)律,在定義數(shù)組的同時,對其中的每一個元素進行初始化。例如:structstudent{longnumber;charname[20];charsex;intage;floatheight;}s[3]={{10101,“zhangsan”,’M’,19,177},{10104,“l(fā)iming”,’F’,20,164.5},{10106,“wangwu”’M’,18,175.5}};7.2.1結(jié)構(gòu)體數(shù)組的定義7.2.3結(jié)構(gòu)體數(shù)組的應(yīng)用【例7.5】計算學(xué)生的平均成績和不及格的人數(shù)?!纠?.6】
編程輸入5個學(xué)生的姓名和數(shù)學(xué)、英語、語文三門課的成績,計算每個學(xué)生的平均成績,并輸出學(xué)生姓名和平均成績。分析:程序中定義一個結(jié)構(gòu)體數(shù)組s,它有5個數(shù)組元素,用于存放5個學(xué)生數(shù)據(jù)。每個數(shù)組元素是structstudent結(jié)構(gòu)體類型變量,包含5個成員:name(姓名)、math(數(shù)學(xué)成績)、eng(英語成績)、cuit(語文成績)、aver(平均成績)。7.3結(jié)構(gòu)體與函數(shù)在C語言中,與前面介紹的其他類型數(shù)據(jù)一樣,結(jié)構(gòu)體也可作為函數(shù)的參數(shù),有以下三種形式:1.結(jié)構(gòu)體變量的成員作函數(shù)的參數(shù)。與普通變量作函數(shù)參數(shù)一樣,是將實參(結(jié)構(gòu)體變量的成員變量)的值向形參進行單向傳遞。2.結(jié)構(gòu)體變量作函數(shù)的參數(shù)。結(jié)構(gòu)體變量作函數(shù)的參數(shù)是將實參(結(jié)構(gòu)體變量的所有成員)的值逐個傳遞給同結(jié)構(gòu)類型形參,因此這種方式也是屬于值的單向傳遞。3.用指向結(jié)構(gòu)體變量(或數(shù)組)的指針作函數(shù)的參數(shù)。在這種情況下,是將結(jié)構(gòu)體變量(或數(shù)組)的首地址傳遞給形參,此時形參和實參有相同的內(nèi)存空間,形參值的改變等價于對應(yīng)實參值的改變,因此它屬于雙向傳遞。7.3結(jié)構(gòu)體與函數(shù)【例7.7】結(jié)構(gòu)體變量作為函數(shù)參數(shù),計算職工的實發(fā)工資?!纠?.8】結(jié)構(gòu)體指針作為函數(shù)參數(shù),設(shè)置學(xué)生成績等級并統(tǒng)計不及格人數(shù)。7.4動態(tài)數(shù)據(jù)結(jié)構(gòu)如何充分利用內(nèi)存空間是計算機軟件設(shè)計中一個非常重要的課題,解決上述問題的關(guān)鍵之一是鏈表技術(shù)及其相關(guān)算法的引入。鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。例如,要建立一個通訊錄,每個通訊記錄包括聯(lián)系人姓名、住址、郵編、電話等數(shù)據(jù)項??梢钥紤]使用數(shù)組存放數(shù)據(jù),但是數(shù)組必須預(yù)先定義它的固定的長度,如50個聯(lián)系人。但是一個通信錄中的聯(lián)系人數(shù)目很難事先確定,而且人數(shù)可能隨時會變化。為了能夠存儲所有聯(lián)系人數(shù)據(jù),必須把數(shù)組的大小定義得足夠大。顯然這樣會浪費內(nèi)存空間。因此采用鏈表就可以解決這些問題。利用結(jié)構(gòu)體變量可以構(gòu)成鏈表這種數(shù)據(jù)結(jié)構(gòu)。單鏈表采用一組不連續(xù)的存儲單元存放鏈表中的數(shù)據(jù)元素,鏈表中的每個元素稱為結(jié)點,而鏈表的每個結(jié)點在存儲器中的位置可以是隨意的,為了明確鏈表中的第一個結(jié)點的位置,需要一個指針指向鏈表的表頭即第一個數(shù)據(jù)元素,這個指針稱為頭指針。每個結(jié)點都包含兩個部分:一是數(shù)據(jù)域,用于存儲數(shù)據(jù)元素;另一個是指針域,用于存放指針,該指針指向下一個結(jié)點。鏈表的最后一個結(jié)點不再指向任何其它結(jié)點,因此稱為“鏈尾”,也稱尾結(jié)點,它的指針域為NULL值,表示鏈表到此結(jié)束。有時為了操作方便,將鏈表的第一個結(jié)點的數(shù)據(jù)域中不存放任何有意義的數(shù)據(jù)或者存放鏈表的一個特殊標(biāo)志,即使鏈表中沒有任何數(shù)據(jù)元素存在時一個空鏈表,該結(jié)點也始終存在,該結(jié)點被稱為頭結(jié)點。一個結(jié)點的下一個結(jié)點,稱為該結(jié)點的后繼結(jié)點,而前面的一個結(jié)點稱為該結(jié)點的前趨結(jié)點。7.4動態(tài)數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作對鏈表的主要操作有以下幾種:建立鏈表:是指從無到有地建立起一個鏈表,即一個一個地輸入各節(jié)點數(shù)據(jù),并建立起前后相鏈接的關(guān)系。結(jié)點的查找與輸出:從鏈表的首節(jié)點開始,依次查找節(jié)點或?qū)⒐?jié)點的數(shù)據(jù)顯示輸出,直至鏈表結(jié)尾。插入一個結(jié)點:首先根據(jù)新節(jié)點的數(shù)據(jù)找到要插入的位置,然后將新節(jié)點與右相鄰的節(jié)點鏈接起來,最后將新節(jié)點與左相鄰的節(jié)點鏈接起來。刪除一個結(jié)點:首先根據(jù)要刪除節(jié)點的數(shù)據(jù)找到要刪除節(jié)點的位置,然后將左相鄰節(jié)點與右相鄰的節(jié)點鏈接起來,釋放被刪除節(jié)點所占的內(nèi)存。7.4動態(tài)數(shù)據(jù)結(jié)構(gòu)【例7.9】建立一個三個結(jié)點的鏈表,存放學(xué)生數(shù)據(jù)。為簡單起見,我們假定學(xué)生數(shù)據(jù)結(jié)構(gòu)中只有學(xué)號和年齡兩項。編寫一個建立鏈表的函數(shù)和一個打印鏈表的函數(shù),建立鏈表并輸出節(jié)點數(shù)據(jù)。7.4動態(tài)數(shù)據(jù)結(jié)構(gòu)7.5共用體所有的成員變量占用同一段內(nèi)存空間。7.5.1共用體類型的定義和引用共用體類型定義的一般形式為:union共用體類型名{
成員表列
};其中,union是關(guān)鍵字,是共用體類型的標(biāo)志,共用體類型名是用戶定義的標(biāo)識符,共用體類型和結(jié)構(gòu)體類型一樣由若干成員組成。例如:uniondata{inti;floatx;};表示定義了一個共用體類型uniondata,它由i和x兩個成員組成。7.5.1共用體類型的定義和引用共用體類型變量的定義和結(jié)構(gòu)體類型變量的的定義類似,也由三種定義的方法:1.先定義共用體類型,再定義共用體類型的變量例如:uniondata{inti
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 不出錢股協(xié)議合同范例
- 三年級口算題集1000道
- 單位財務(wù)借款合同范本
- 北京墻面防水采購合同范本
- 2025海南省建筑安全員《B證》考試題庫
- 印刷刊合同范本
- 倉儲散租合同范例
- 個人繳納社保合同范本
- 出口卡車出售合同范本
- 2025建筑安全員《A證》考試題庫
- (正式版)SHT 3227-2024 石油化工裝置固定水噴霧和水(泡沫)噴淋滅火系統(tǒng)技術(shù)標(biāo)準(zhǔn)
- 2024屆廣東省深圳市中考物理模擬試卷(一模)(附答案)
- 前庭功能鍛煉科普知識講座
- 供應(yīng)鏈戰(zhàn)略布局與區(qū)域拓展案例
- 上海話培訓(xùn)課件
- 注塑車間績效考核方案
- 初中英語閱讀理解專項練習(xí)26篇(含答案)
- 誦讀經(jīng)典傳承文明課件
- 高中數(shù)學(xué)選擇性必修3 教材習(xí)題答案
- 北師大版二年級下冊數(shù)學(xué)第一單元 除法教案
- 2024年兒童托管行業(yè)分析報告及未來發(fā)展趨勢
評論
0/150
提交評論