計算機(jī)二級C語言_第14章__結(jié)構(gòu)體、共用體和用戶自定義類型_第1頁
計算機(jī)二級C語言_第14章__結(jié)構(gòu)體、共用體和用戶自定義類型_第2頁
計算機(jī)二級C語言_第14章__結(jié)構(gòu)體、共用體和用戶自定義類型_第3頁
計算機(jī)二級C語言_第14章__結(jié)構(gòu)體、共用體和用戶自定義類型_第4頁
計算機(jī)二級C語言_第14章__結(jié)構(gòu)體、共用體和用戶自定義類型_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、本章重點(diǎn)14.1 用typedef說明一種新類型名 14.2 結(jié)構(gòu)體類型14.3 共用體第第14章章 結(jié)構(gòu)體、共用體和用戶自定義類型結(jié)構(gòu)體、共用體和用戶自定義類型14.1 用typedef說明一種新類型名語言允許用戶自己定義類型說明符,也就是說允許由用戶為數(shù)據(jù)類型取“別名”。類型定義符typedef即可用來完成此功能,它可以語言的基本數(shù)據(jù)類型取“別名”,也可以為用戶自定義的結(jié)構(gòu)類型取“別名”。例如, typedef int INTEGER這以后就可用INTEGER來代替int作整型變量的類型說明了。例如:INTEGER a,b;它等效于:int a,b;用typedef定義數(shù)組類型、指針類型、

2、結(jié)構(gòu)類型將帶來很大的方便,不僅使程序書寫簡潔,而且增強(qiáng)了可讀性。例如:typedef char NAME20; 表示NAME是字符數(shù)組類型,數(shù)組長度為20。然后可用NAME 說明變量,如:NAME a1,a2,s1,s2;完全等效于:char a120,a220,s120,s220typedef struct stu char name20;int age; char sex; Student;定義Student表示struct stu的結(jié)構(gòu)類型,然后可用Student來說明結(jié)構(gòu)變量:Student body1,body2;typedef定義的一般形式為:typedef 原類型名 新類型名 有

3、時也可用宏定義(#define)來代替typedef的功能,但是宏定義是由預(yù)處理完成的,而typedef則是在編譯時完成的,它并不只是作簡單的字符替換。14.2 結(jié)構(gòu)體類型C語言的基本數(shù)據(jù)類型有整型,實(shí)型,字符型等,在實(shí)際問題中,把一個對象抽象成數(shù)據(jù)來表示時,往往需要一組不同基本數(shù)據(jù)類型的組合。 14.2.1 結(jié)構(gòu)體類型的說明結(jié)構(gòu)體類型說明的一般形式是:struct 結(jié)構(gòu)體標(biāo)識名 類型名1 結(jié)構(gòu)成員名表1; 類型名2 結(jié)構(gòu)成員名表2; 類型名n 結(jié)構(gòu)成員名表n; ;其中struct是關(guān)鍵字,是結(jié)構(gòu)體類型的標(biāo)志?!敖Y(jié)構(gòu)體標(biāo)識名”和“結(jié)構(gòu)成員名”都是用戶定義的標(biāo)識符。其中“結(jié)構(gòu)體標(biāo)識名”是可選項(xiàng),

4、在說明中可以不出現(xiàn)。成員表列由若干個成員組成,由一對大括號括起來,每個成員都是該結(jié)構(gòu)的一個組成部分。對每個成員也必須作類型聲明,其形式如下: 類型說明符 成員名;結(jié)構(gòu)體成員名表中可以含有多個同類型的成員名,它們之間用逗號分隔。例如:struct student int math score, ;english score, sum;結(jié)構(gòu)體中的成員名可以和程序中的其它變量同名;不同結(jié)構(gòu)體中的成員也可以同名。 在成員列表中,類型名1類型名n不僅可以是簡單數(shù)據(jù)類型,也可以是構(gòu)造類型,所以也可以是某種結(jié)構(gòu)體類型。這時稱為結(jié)構(gòu)體的嵌套。嵌套時允許內(nèi)嵌結(jié)構(gòu)體成員名與外層成員的名字相同。例如:struct

5、student char name10; char sex; struct date birthday; float score5; ;以上說明中,birthday成員的類型struct date是一個已經(jīng)說明過的結(jié)構(gòu)體類型。若事先沒有說明這一類型,則以上結(jié)構(gòu)體類型說明可改寫成如下:struct student char name10; char sex; struct int year;int month;int day; birthday; float score5; ;14.2.2 結(jié)構(gòu)體類型的變量的定義定義結(jié)構(gòu)類型變量由以下四種方法:1先定義結(jié)構(gòu),再說明結(jié)構(gòu)變量。例如:struct s

6、tudent int number; char name31; short age; char sex; char grade; char address101;struct student boy1, boy2;2在定義結(jié)構(gòu)類型的同時說明結(jié)構(gòu)變量。這種形式說明的一般形式為:struct 結(jié)構(gòu)名成員表列 變量名表列;例如:struct student int number; char name31; short age; char sex; char grade; char address101; boy1, boy2;3直接說明結(jié)構(gòu)變量。即在結(jié)構(gòu)變量定義中省去了結(jié)構(gòu)類型名,而直接給出結(jié)構(gòu)變量

7、。一般形式為:struct成員表列 變量名表列;例如以上結(jié)構(gòu)中把student省略,struct boy1, boy2;4使用typedef說明一個結(jié)構(gòu)體類型名,再用新類型名來定義變量。例如:typedef struct char ame2; char sex; struct date birthday; float sc4; STREC;STREC boy1, boy2;此處STREC是一個具體的結(jié)構(gòu)體類型名,它能夠唯一的標(biāo)識這種結(jié)構(gòu)體類型。因此,可用它來定義變量,不可再寫關(guān)鍵字struct。14.2.3 結(jié)構(gòu)體類型的變量的引用表示結(jié)構(gòu)變量成員的一般形式是:結(jié)構(gòu)變量名.成員名例如: boy1

8、. number 即boy1的學(xué)號boy2. name 即boy2的名字結(jié)構(gòu)變量的成員,與相同類型的普通變量并無區(qū)別,可以像普通變量一樣參與各種運(yùn)算,這根據(jù)其類型決定。例如:boy1.number = ;相同類型的結(jié)構(gòu)體變量之間還可以進(jìn)行整體引用賦值,例如:struct char name10; int num; per1, per2=“WUTING”, 23;執(zhí)行賦值語句:per1=per2;后,per2中每個成員變量的值都賦給了per1中對應(yīng)的同名成員。這種賦值方式很簡潔,但必須保證賦值號兩邊的結(jié)構(gòu)體變量類型相同。14.2.4 結(jié)構(gòu)體類型變量的賦值和初始化結(jié)構(gòu)變量的賦值就

9、是給各結(jié)構(gòu)成員賦值??捎幂斎胝Z句或賦值語句來完成。例如:#include stdio.hint main(void)struct Studentint number; char name31; short age; char sex; char grade; boy1, boy2; boy1.number = 1461; printf(input name:); scanf(%s, ); printf(input age:); scanf(%d, &boy1.age); boy1.sex=m; boy1.grade=5; boy2=boy1; return 0;程序運(yùn)

10、行時輸入:input name:zhanginput age:12 和其他類型變量一樣,對結(jié)構(gòu)變量可以在定義時進(jìn)行初始化賦值。#include stdio.hint main(void) struct Student int number; char name31; short age; char sex; char grade; boy2, boy1 = 1461, zhang, 12, m, 5; boy2=boy1; return 0;14.2.5 結(jié)構(gòu)體類型數(shù)組 定義結(jié)構(gòu)體數(shù)組的方法和結(jié)構(gòu)變量相似,只需說明它為數(shù)組類型即可。例如:struct student int number; c

11、har name31; short age; char sex; char grade; student50;在定義結(jié)構(gòu)體數(shù)組時,對其作初始化賦值,可不指定數(shù)組的長度,此時數(shù)組長度等于賦值項(xiàng)數(shù)。由于數(shù)組中的每個元素都是一個結(jié)構(gòu)體,所以通常將其成員的值依次放在一對大括號中,以便區(qū)分各個元素。例如:struct bookcard char num5; float money; bk3= “NO.1”, 32.5, “NO.2”, 40.0, “NO.3”, 65.5 ; 給二維數(shù)組的賦值規(guī)則同上 14.2.6 結(jié)構(gòu)體指針變量1結(jié)構(gòu)變量的指針一個指針變量當(dāng)用來指向一個結(jié)構(gòu)變量時,稱之為結(jié)構(gòu)指針變量。

12、結(jié)構(gòu)指針變量中的值是所指向的結(jié)構(gòu)變量的首地址。有了結(jié)構(gòu)指針,就可通過結(jié)構(gòu)指針來訪問結(jié)構(gòu)變量或結(jié)構(gòu)變量成員,這與通過數(shù)組指針來訪問數(shù)組或數(shù)組元素是相同的。結(jié)構(gòu)指針變量說明的一般形式為:struct 結(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)指針變量-成員名例如:(*ps).number 或 ps-number一個結(jié)構(gòu)指針變量雖然可以用來訪問結(jié)構(gòu)變量,但是,不能使它指向一個成員。也就是說不允許取一個

13、成員的地址來賦予它。2結(jié)構(gòu)數(shù)組的指針設(shè)pt指向的結(jié)構(gòu)變量pt-number pt指向的結(jié)構(gòu)變量的成員的number的值pt-number+ pt指向的結(jié)構(gòu)變量的成員的number的值,使用后加1+pt-number pt指向的結(jié)構(gòu)變量的成員的number先加1,再使用設(shè)pt指向的結(jié)構(gòu)數(shù)組(+pt)-number 先使pt指向下一數(shù)組元素,得到其number的值pt+-number 等同于(pt+)-number(pt+)-number 得到pt當(dāng)前指向數(shù)組元素的number值,后使pt指向下一元素 3結(jié)構(gòu)指針變量作為函數(shù)參數(shù)把一個結(jié)構(gòu)變量的值傳遞到另一個函數(shù),有3種方式:(1)傳遞結(jié)構(gòu)成員。

14、(2)傳遞結(jié)構(gòu)變量。 (3)傳遞結(jié)構(gòu)指針。 14.2.7 鏈表 使用數(shù)組存放數(shù)據(jù),必須事先定義好數(shù)組的長度。但數(shù)組元素的插入和刪除會引起大量數(shù)據(jù)的移動,從而使簡單的數(shù)據(jù)處理變得非常低效。為了能有效地解決這些問題,一種稱為鏈表的結(jié)構(gòu)類型得到了廣泛的應(yīng)用。 鏈表是一種動態(tài)數(shù)據(jù)結(jié)構(gòu),它的特點(diǎn)是用一組任意的存儲單元(可以是連續(xù)的,也可以是不連續(xù)的)存放數(shù)據(jù)元素。鏈表中每一個元素稱為結(jié)點(diǎn),每一個結(jié)點(diǎn)都是由數(shù)據(jù)域和指針域組成的。每個結(jié)點(diǎn)中的指針域,包含一個指針,指向下一個結(jié)點(diǎn);也可以多個指針指(如雙向鏈表)。 鏈表有一個頭結(jié)點(diǎn),表示鏈表中的第一個元素,它的指針指向第二個結(jié)點(diǎn)。第二個結(jié)點(diǎn)的指針指向第三個結(jié)點(diǎn)

15、,如此往復(fù),直到最后一個元素,這就是鏈表的尾結(jié)點(diǎn),它的指針存放的是空值(NULL指針)。1靜態(tài)鏈表靜態(tài)鏈表的節(jié)點(diǎn)是在程序中事先定義好的,不是在運(yùn)行時動態(tài)分配的,故稱靜態(tài)鏈表。例如以下靜態(tài)鏈表的創(chuàng)建和輸出。2動態(tài)鏈表的創(chuàng)建和刪除動態(tài)鏈表的創(chuàng)建是指在程序執(zhí)行時,建立起一個一個節(jié)點(diǎn),并將它們連接成一串,形成一個鏈表。動態(tài)鏈表不再是用時,應(yīng)及時的刪除,以釋放動態(tài)鏈表占用的內(nèi)存。 14.3 共用體共用體的類型說明和變量的定義方式與結(jié)構(gòu)體的類型說明和變量定義方式完全相同,不同的是共用體變量中的所有成員占有同一個存儲空間。14.3.1 共用體類型的說明和變量定義1共用體類型說明共用體類型說明的一般形式為:

16、union 共用體標(biāo)識名 類型名1 共用體成員名1; 類型名2 共用體成員名2; 類型名n 共用體成員名n; ;說明:union為關(guān)鍵字,是共用體類型的標(biāo)志。共用體表示幾個變量公用一個內(nèi)存位置, 在不同的時間保存不同的數(shù)據(jù)類型和不同長度的變量。在內(nèi)存單元中,所有成員具有相同的首地址,并且重疊在一起。共用體中的成員可以是簡單變量,也可以是數(shù)組、指針、結(jié)構(gòu)體和共用體。2共用體變量的定義用已說明的共用體類型來定義共用體變量。和定義結(jié)構(gòu)體變量類似,可以采用以下幾種方式:先定義共用體類型再定義變量;定義共用體類型的同時定義變量;直接定義共用體變量。例如,有一共用體類型定義如下:union cif_ty

17、char c; int i; float f; ; 用已說明的共用體類型來定義共用體變量。即用上面說明的共用體類型cif_ty定義一個名為cif的共用體變量, 可寫成: union cif_ty cif;也可以在定義共用體類型的同時定義共用體變量。例:union cif_ty char c; int i; float f; cif;還可以直接定義共用體變量。例:union char c; int i; float f; cif;在共用體變量cif中, 字符變量c,整型變量i,和浮點(diǎn)變量f公用同一內(nèi)存位置。當(dāng)一個共用體變量被定義時, 編譯程序?qū)凑展灿皿w變量中最大的成員長度分配一塊內(nèi)存。同樣也可

18、以定義共用體數(shù)組變量或共用體指針變量,例:union cif_ty ug3;union cif_ty *up=ug;當(dāng)定義共用體指針時, 也要用-符號, 來訪問共用體成員,可表示成: 共用體變量名-成員名 另外, 共用體類型和結(jié)構(gòu)類型可以互相嵌套,共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型的定義中;結(jié)構(gòu)體類型也可以出現(xiàn)在共用體類型的定義中。 14.3.2 共用體變量的引用1共用體變量中成員的引用可以使用以下三種形式引用共用體變量中的成員:(1)共用體變量名.成員名(2)指針變量名成員名(3)(*指針變量名).成員名例如,對前一小節(jié)定義得共用體變量cif,如下引用其個成員:cif.c 引用char型成員c cif.i 引用int型成員icif.f 引用float型成員f共用體中的成員變量可參與其所屬類型允許的任何操作。但在訪問共用體成員時應(yīng)注意,共用體變量中起作用的是最近一次存入

溫馨提示

  • 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

提交評論