第9章結(jié)構(gòu)體和共用體12(07)-_第1頁
第9章結(jié)構(gòu)體和共用體12(07)-_第2頁
第9章結(jié)構(gòu)體和共用體12(07)-_第3頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第 9 章結(jié)構(gòu)體和共用體 12( 07) -博雅研究谷 -讓信息技術(shù)更容易教學(xué),在信息技術(shù)學(xué)習(xí)中更有效第 9 章結(jié)構(gòu)和公地學(xué)習(xí)目標(biāo)?掌握結(jié)構(gòu)類型和變量的定義和初始化?掌握結(jié)構(gòu)變量引用 ?掌握結(jié)構(gòu)和數(shù)組、指針、函數(shù)等的組合。掌握常見身體變量的定 義和參考?理解結(jié)構(gòu)和共享空間的內(nèi)存分配機(jī)制前幾章學(xué)習(xí)的數(shù)據(jù)類型是分散的, 相互獨(dú)立的。例如,int a和char b被定義為兩個(gè)沒有內(nèi)部聯(lián)系的變量。然而,在現(xiàn)實(shí)生活和工作中,經(jīng) 常需要處理一些密切相關(guān)的數(shù)據(jù),例如描述公司員工的姓名、部門、 職位、電話號(hào)碼和電子郵件地址。因?yàn)檫@些數(shù)據(jù)類型不同,所以很難 僅通過上一章學(xué)習(xí)的基本類型和數(shù)組來統(tǒng)一管理這些數(shù)據(jù)。為

2、此, C 語言提供了另外兩種構(gòu)造類型, 即結(jié)構(gòu)和公共體。 本章將詳細(xì)解釋這 兩種構(gòu)造類型。9.1 結(jié)構(gòu)類型和結(jié)構(gòu)變量結(jié)構(gòu)類型定義結(jié)構(gòu)是一種集成不同類型數(shù)據(jù)的結(jié)構(gòu)數(shù)據(jù)類型。每個(gè)數(shù)據(jù)都被稱為 結(jié)構(gòu)類型的成員在程序設(shè)計(jì)中, 當(dāng)使用結(jié)構(gòu)類型時(shí), 必須首先描述結(jié) 構(gòu)類型的組成。結(jié)構(gòu)類型定義如下 : 結(jié)構(gòu)類型名稱 ;數(shù)據(jù)類型成員名稱 1;數(shù)據(jù)類型成員名稱 2;數(shù)據(jù)類型成員名稱 n;在上述語法結(jié)構(gòu)中,“ struc是定義結(jié)構(gòu)類型的關(guān)鍵字,后跟定義的“結(jié)構(gòu)類型名稱 ”。在“結(jié)構(gòu)類型名稱 ”下的括號(hào)中,定義了結(jié)構(gòu)類型的 成員項(xiàng),每個(gè)成員由 “數(shù)據(jù)類型”和“成員名稱”組成例如,為了描述一組學(xué)生信息, 信息由學(xué)生編

3、號(hào) (數(shù)字 )、姓名 (姓名)、 性別(性別)、年齡(年齡)、地址(地址)等組成。我們可以使用以下語句 來定義一個(gè)名為 “學(xué)生”的結(jié)構(gòu)類型 :1學(xué)歸 -使信息技術(shù)教學(xué)更簡(jiǎn)單,信息技術(shù)學(xué)習(xí)更有效結(jié)構(gòu)學(xué)生 ;整數(shù);char name10;迷人的性;國際年齡;char 地址30;在上述結(jié)構(gòu)類型的定義中, 結(jié)構(gòu)類型學(xué)生由 5 個(gè)成員組成, 即人數(shù)、 姓名、性別、年齡和地址值得一提的是,結(jié)構(gòu)類型中的成員也可以是結(jié)構(gòu)變量。例如,出生 日期信息被添加到學(xué)生信息中。具體代碼如下 : 結(jié)構(gòu)日期 ; 結(jié)構(gòu)學(xué)生 整數(shù);char name10;迷人的性;結(jié)構(gòu)生日;年份;國際月;國際日; stu 1 ;在上面的代碼中,

4、我們首先定義了結(jié)構(gòu)類型 Date,它由三個(gè)成員組 成:年、月和日。然后定義結(jié)構(gòu)變量 stul,其中成員生日是日期結(jié)構(gòu)類型學(xué)生的類型結(jié)構(gòu)如圖 9-1 所示numnamemesexexyearyearbydaydaydaydaymonthmonthyday圖 9-1 結(jié)構(gòu)類型學(xué)生類型結(jié)構(gòu)注:1,結(jié)構(gòu)類型定義以關(guān)鍵字 struct 開頭,后跟結(jié)構(gòu)類型的名稱,其命名規(guī)則與變量名相同。2,在定義了一個(gè)結(jié)構(gòu)類型之后, 并不意味著立即分配一個(gè)存儲(chǔ)單元 來存儲(chǔ)每個(gè)數(shù)據(jù)成員, 它只是告訴編譯器結(jié)構(gòu)類型是由哪些數(shù)據(jù)類型 的成員組成的,每個(gè)成員占用多少字節(jié),以什么格式,并把它們作為 一個(gè)整體來處理3,結(jié)構(gòu)類型定義末

5、尾括號(hào)后的分號(hào)是必不可少的4,結(jié)構(gòu)類型的成員可以是結(jié)構(gòu)變量, 但不能是其自身結(jié)構(gòu)類型的變 量結(jié)構(gòu)變量的定義前一節(jié)只定義了結(jié)構(gòu)類型,它只相當(dāng)于一個(gè)模型,其中沒有特定的數(shù)據(jù), 系統(tǒng)不會(huì)為其分配內(nèi)存空間。 為了在程序中使用結(jié)構(gòu)類型的數(shù)據(jù), 應(yīng) 定義結(jié)構(gòu)類型的變量,并在其中存儲(chǔ) 2博雅研究谷 -使信息技術(shù)教學(xué)更簡(jiǎn)單, 信息技術(shù)學(xué)習(xí)更有效地輸入特定數(shù)據(jù)。以下是定義結(jié)構(gòu)變量的三種方法1。首先定義結(jié)構(gòu)類型,然后定義結(jié)構(gòu)變量,就可以定義結(jié)構(gòu)變量。定義結(jié)構(gòu)變量的語法格式如下 :結(jié)構(gòu)類型名稱結(jié)構(gòu)變量名稱;例如:structure studenty1,student 2;以上示例定義了結(jié)構(gòu)類型變量 stul和stu

6、2,當(dāng)變量stul和stu2具有結(jié)構(gòu)特征時(shí),它們各自存儲(chǔ)一組基本類型變量,如圖 9-2 所示張三張三 李云滿滿滿滿滿女 23232525北京上海圖 9-2 變量 stu 1 和 stu 2的存儲(chǔ)結(jié)構(gòu)。從圖9-2可以看出,變量stul和stu2分別占據(jù)連續(xù)的存儲(chǔ)空間2.定義結(jié)構(gòu)類型時(shí)定義結(jié)構(gòu)變量與第一種方法具有相同的功能,其語法格式如下 :結(jié)構(gòu)類型名稱 數(shù)據(jù)類型成員名稱 1;數(shù)據(jù)類型成員名稱 2;數(shù)據(jù)類型成員名稱 n; 結(jié)構(gòu)變量名稱列表;例如:struct student int num ; char name10;迷人的性; stu1 、stu2在定義結(jié)構(gòu)類型student時(shí),上面的代碼還定義

7、了結(jié)構(gòu)類型變量stul和stu2變量stu1和stu2中包含的成員的數(shù)據(jù)類型是相同的3,結(jié)構(gòu)變量的直接定義除了上述兩種方法外,我們還可以用以下語法直接定義結(jié)構(gòu)變量 : struct 數(shù)據(jù)類型成員名稱1;數(shù)據(jù)類型成員名稱2; 數(shù)據(jù)類型成員名稱 n;結(jié)構(gòu)變量名稱列表;例如:3博雅研究谷 -使信息技術(shù)更容易教學(xué),對(duì)信息技術(shù)學(xué)習(xí)更有效 結(jié)構(gòu)int num; char name10;迷人的性; stu1、stu2上面的代碼也定義了結(jié)構(gòu)變量 stul和stu2,但是以這種方式定義的 結(jié)構(gòu)沒有類型名,我們稱之為匿名結(jié)構(gòu)。結(jié)構(gòu)類型是用戶定義的數(shù)據(jù)類型。它不會(huì)在編譯時(shí)為結(jié)構(gòu)類型分配空間,就像前面描述的簡(jiǎn)單數(shù)據(jù)類

8、型一樣。 只有當(dāng)它被用來定義一個(gè) 變量時(shí),結(jié)構(gòu)變量才會(huì)被分配結(jié)構(gòu)類型所需大小的存儲(chǔ)單元結(jié)構(gòu)變量的內(nèi)存分配一旦定義了結(jié)構(gòu)變量,系統(tǒng)將為其分配內(nèi)存結(jié)構(gòu)變量占用的內(nèi)存大小是根據(jù)字 節(jié)對(duì)齊機(jī)制分配的。字節(jié)對(duì)齊意味著字節(jié)按照一定的規(guī)則排列在空間 中。一般來說,字節(jié)對(duì)齊滿足以下兩個(gè)原則 :(1)結(jié)構(gòu)的每個(gè)成員變量相對(duì)于該結(jié)構(gòu)的第一個(gè)地址的偏移量是基本數(shù)據(jù)類型 (不包括結(jié)構(gòu)、數(shù)組等 )大小的整數(shù)倍。 )的成員變量;如果沒有,編譯器將在成員之間添加填充字節(jié)接下來通過一個(gè)案例打印每個(gè)成員變量的地址,如示例 9-1 所示例9-11 #include 2 /直接定義結(jié)構(gòu)變量 3 struct 4 5 6 7 8 c

9、har a;雙 b; int c;短 d;10 void main()11 12 13 14 15 17 成 員 變 量 b 的 地成員變量 d 的地成 員變量 a 的地址址成員變量 c 的地址址:dn成員變量d的地址:% d n | 16)4博雅研究谷 -使信息技術(shù)更容易教信息技術(shù), 更有效地學(xué)習(xí)信息技術(shù)圖 9-3 運(yùn)行結(jié)果從圖 9-3 可以看出,結(jié)構(gòu)變量中成員變量的地址被打印出來。結(jié)構(gòu)變量s中每個(gè)成員占用的內(nèi)存如圖9-4所示圖 9-4 的結(jié)構(gòu)變量中每個(gè)成員占用的內(nèi)存。接下來,根據(jù)圖 9-3 和9-4,逐步分析每個(gè)成員變量的地址?成員變量 A 的地址是 3703968,也是結(jié)構(gòu)變量 S 的第

10、一個(gè)地址; ?成員變量 B 的地址是 3703976,與結(jié)構(gòu)變量的第一個(gè)地址的偏移 量是 8 字節(jié)。這是因?yàn)槭浅蓡T變量 B 的基本數(shù)據(jù)類型,它是雙精度的,并且它的偏移量應(yīng)該是8的倍數(shù)(sizeof(double),所以變量A用7個(gè)字節(jié)填充;?成員變量 C 的地址是 3703984,與結(jié)構(gòu)變量第一個(gè)地址的偏移量 是 16,這是變量 A 和變量B占用的內(nèi)存大小之和,正好是 4的倍數(shù)(sizeof(int);?成員變量D的地址是3703988,與第一個(gè)地址的偏移量是20字節(jié)。 它是變量A、B和C占用的個(gè)內(nèi)存大小的總和,正好是2的倍數(shù)(sizeof(short)(2)結(jié)構(gòu)的總大小是該結(jié)構(gòu)最寬的基本類型

11、成員大小的整數(shù)倍。如果 不夠,編譯器將在最后一個(gè)成員后添加填充字節(jié)。通過實(shí)例9-1的分析,結(jié)構(gòu)變量S的內(nèi)存大小可以計(jì)算為22,但這 不符合字節(jié)對(duì)齊的第二個(gè)標(biāo)準(zhǔn)。 示例 9-1 中的結(jié)構(gòu)變量的內(nèi)存大小將 如下例 9-2 所示打印。例 9-21 #包括 2 結(jié)構(gòu) 3 4 5 6 7chara;雙 b; int c; 短 d;8 s;9 void main()10 11 12 內(nèi)存中結(jié)構(gòu)變量s的大小:dn運(yùn)行結(jié)果如圖 9-5 所示5博雅研究谷 -使信息技術(shù)更容易教信息技術(shù), 更有效地學(xué)習(xí)信息技術(shù)圖 9-5 運(yùn)行結(jié)果從圖 9-5 可以看出,結(jié)構(gòu)變量 s 的內(nèi)存大小是 24 字節(jié),而不是 22 字節(jié)這是

12、因?yàn)榻Y(jié)構(gòu)的總大小應(yīng)該是最寬基類型的成員大小的整數(shù)倍 成員變量中最寬的基本類型的大小為 8(雙倍),因此在 d 之后填充 2 字節(jié),結(jié)構(gòu)變量s占用的內(nèi)存大小為24字節(jié)內(nèi)存分配如圖9-6所示占用1字節(jié)來填充7字節(jié)s成員aa占用8字節(jié)成員bb占用4字節(jié) 成員cc占用2字節(jié)來填充2字節(jié)成員dd圖9-6結(jié)構(gòu)s占用總內(nèi)存大小應(yīng)該注意,如果結(jié)構(gòu)中有結(jié)構(gòu)類型變量,如結(jié)構(gòu)中的char類型數(shù)組成員,則其偏移量基于數(shù)組中的元素類型,即偏移量是 1 的倍數(shù) (sizeof(char)對(duì)于int類型的數(shù)組,偏移量是 4的倍數(shù)(sizeof(int) 關(guān)于結(jié)構(gòu)變量的分配,不同的編譯器有不同的分配規(guī)則。讀者可以 理解。在實(shí)

13、際應(yīng)用中,sizeof()運(yùn)算符可用于快速找到結(jié)構(gòu)變量的大小。結(jié)構(gòu)變量的初始化由于結(jié)構(gòu)變量存儲(chǔ)一組不同類型的數(shù)據(jù),初 始化結(jié)構(gòu)變量的過程實(shí)際上就是初始化結(jié)構(gòu)中每個(gè)成員的過程根據(jù) 定義結(jié)構(gòu)變量的不同方式,有兩種初始化結(jié)構(gòu)變量的方法。1。定義結(jié)構(gòu)類型和結(jié)構(gòu)變量時(shí)初始化結(jié)構(gòu)變量。具體例子如下結(jié)構(gòu)學(xué)生 整數(shù);char name10;迷人的性;斯圖= 20140101。上述代碼在定義結(jié)構(gòu)變量 stu 時(shí)初始化了它的成員 2.定義結(jié)構(gòu)類型 后,初始化結(jié)構(gòu)變量。具體例子如下 :結(jié)構(gòu)學(xué)生 ;結(jié)構(gòu)學(xué)生數(shù) = 20140101 , 整數(shù);char name10;迷人的性;在上面的代碼中,首先定義了一個(gè)結(jié)構(gòu)類型St

14、uden,然后在定義結(jié)構(gòu)變量時(shí)初始化它的成員6博雅研究谷 -讓信息技術(shù)更容易教學(xué),對(duì)信息技術(shù)學(xué)習(xí)更有效?注意 :當(dāng)初始化一部分成員變量時(shí),如果只有一部分成員被初始化,前一個(gè)成員應(yīng)該被初始化,后 一個(gè)成員可以是自由的, 因?yàn)楫?dāng)分配成員變量時(shí), 編譯器在成員之間 進(jìn)行匹配, 而不是根據(jù)數(shù)據(jù)類型自動(dòng)匹配一些成員可以被初始化, 然 后打印出來,如例 9-3 所示。例 9-3# includes tructstudent int num ; char name10;迷人的性;斯圖= 20140101,' M ; void main()printf(printf( printf( )運(yùn)行如圖 9-

15、7 所示圖 9-7 運(yùn)行結(jié)果如圖9-7所示,在結(jié)構(gòu)變量stu中只分配了 num和sex,但當(dāng)輸出所 有成員的值時(shí),“ M被分配給name, sex沒有值對(duì)結(jié)構(gòu)變量 的引用定義并初始化結(jié)構(gòu)變量以使用結(jié)構(gòu)變量中的成員在 C 語言 中,引用結(jié)構(gòu)變量成員的方式如下 :結(jié)構(gòu)變量名。成員名稱;例如,以下語句用于引用結(jié)構(gòu)變量 stul中的num成員:stu 1 . num; 為了幫助大家更好地掌握結(jié)構(gòu)變量的使用,通過一個(gè)案例輸出結(jié)構(gòu) 變量中所有成員的值,如例 9-4所示。例 9-41 # INCLUDE 2 # INCLUDE 3 STRUCT STUDENT 4 7博雅研究谷 -使信息技術(shù)教學(xué)更簡(jiǎn)單,信息

16、技術(shù)學(xué)習(xí)更有效5 6 7 ;8 void main()9 10 12 13 struct 學(xué)生二 24;char name50;國際年齡;的運(yùn)行結(jié)果如圖 9-8 所示圖 9-8 運(yùn)行結(jié)果從圖 9-8 中可以看出,結(jié)構(gòu)變量中的成員名稱和年齡的值被輸出9.2 結(jié)構(gòu)數(shù)組 結(jié)構(gòu)變量可以存儲(chǔ)一組數(shù)據(jù),如學(xué)生的序列號(hào)、姓名、性別和其他 數(shù)據(jù)如果有 10 個(gè)學(xué)生的信息需要存儲(chǔ),可以使用一系列結(jié)構(gòu)。與前 面解釋的數(shù)組不同, 結(jié)構(gòu)數(shù)組中的每個(gè)元素都是結(jié)構(gòu)類型的, 它們都 是具有幾個(gè)成員的項(xiàng)。 本節(jié)將詳細(xì)解釋結(jié)構(gòu)數(shù)組的定義、 引用和初始 化方法。結(jié)構(gòu)數(shù)組的定義假設(shè)一個(gè)班有 20 名學(xué)生。如果我們需要描述這 20

17、個(gè)學(xué)生的信息, 我們可以定義一個(gè)長(zhǎng)度為 20 的學(xué)生類型數(shù)組。就像定義結(jié)構(gòu)變量一 樣,我們可以用三種方式定義結(jié)構(gòu)數(shù)組 stu1。首先定義結(jié)構(gòu)類型,然后定義結(jié)構(gòu)數(shù)組。具體例子如下:結(jié)構(gòu)學(xué)生 ;結(jié)構(gòu)學(xué)生 20;整數(shù);char name10;迷人的性;2。定義結(jié)構(gòu)類型時(shí)定義結(jié)構(gòu)數(shù)組。具體例子如下 : 結(jié)構(gòu)學(xué)生 整數(shù);char name10;迷人的性;斯圖斯20;8博雅研究谷 - 為了使信息技術(shù)更容易教學(xué)和在信息技術(shù)學(xué)習(xí)中更有效3,直接定義結(jié)構(gòu)數(shù)組,具體示例如下 :struct int num; char name10;迷人的性;斯圖斯20;9.2.2 結(jié)構(gòu)數(shù)組的初始化 結(jié)構(gòu)數(shù)組的初始化類似于數(shù)組的初

18、始化,通過給元素賦值來完成。由于結(jié)構(gòu)數(shù)組中的每個(gè)元素都是一個(gè)結(jié)構(gòu)變量, 因此在為每個(gè)元素賦 值時(shí),需要將它的成員的值依次放在一對(duì)大括號(hào)中。以為例,定義一個(gè)學(xué)生結(jié)構(gòu)數(shù)組, 該數(shù)組有 3 個(gè)元素,每個(gè)元素有 num、 name、sex 三個(gè)成員,可以用以下兩種方式初始化學(xué)生結(jié)構(gòu)數(shù)組1 ,首先定義結(jié)構(gòu)數(shù)組類型,然后初始化結(jié)構(gòu)數(shù)組。具體例子如下 : 結(jié)構(gòu)學(xué)生 ;結(jié)構(gòu)學(xué)生 3 = 20140101 ,20140102 , 20140103, ;整數(shù);char name10;迷人的性;2。定義結(jié)構(gòu)數(shù)組時(shí)初始化結(jié)構(gòu)數(shù)組。具體例子如下:結(jié)構(gòu)學(xué)生 整數(shù);char name10;迷人的性;20140102,201

19、40103, ;學(xué)生3 = 20140101 。- 當(dāng)然,這樣初始化結(jié)構(gòu)數(shù)組時(shí),可以不指定結(jié)構(gòu)數(shù)組的長(zhǎng)度,編譯時(shí) 系統(tǒng)會(huì)根據(jù)初始化值自動(dòng)確定結(jié)構(gòu)數(shù)組的長(zhǎng)度。 例如,以下初始化方 法也是合法的 結(jié)構(gòu)學(xué)生 整數(shù);char name10;迷人的性;9博雅研究谷 -讓信息技術(shù)更容易教學(xué),在信息技術(shù)學(xué)習(xí)中更有效 學(xué)生 = 20140101 ,20140102,20140103, ;引用結(jié)構(gòu)數(shù)組引用 結(jié)構(gòu)數(shù)組引用結(jié)構(gòu)數(shù)組元素。因?yàn)槊總€(gè)結(jié)構(gòu)數(shù)組元素都是一個(gè)結(jié)構(gòu) 變量,所以結(jié)構(gòu)數(shù)組元素的引用方式與結(jié)構(gòu)變量相似。 其語法格式如 下:數(shù)組元素名。成員名稱;例如,要引用第 9.2.2 小節(jié)中結(jié)構(gòu)數(shù)組學(xué)生的第一個(gè)元素

20、的 num 成 員,可以使用以下方法 :學(xué)生0。num為了幫助讀者更好地掌握結(jié)構(gòu)數(shù)組的引用,下面的示例用于輸出結(jié)構(gòu)數(shù)組的所有成員,如示例 9-5 所示。例 9-51 #包括 2 #包括 3 #結(jié)構(gòu)學(xué)生 4 5 67 ;8 void main()9 10 11 12 13 14 15 struct Student s2= (int I = 0 ; I printf( char name50;學(xué)生間差異;的運(yùn)行結(jié)果如圖 9-9 所示圖 9-9 運(yùn)行結(jié)果在例9-5中,首先定義長(zhǎng)度為2的結(jié)構(gòu)數(shù)組s,并初始化數(shù)組中的元素然后,使用 for 循環(huán),依次輸出 0和1中的成員值9.3 結(jié)構(gòu)指針變量在第 6 章

21、學(xué)習(xí)指針時(shí),指針指向基本數(shù)據(jù)類型事實(shí)上,指針也可以 指向結(jié)構(gòu), 這被稱為結(jié)構(gòu)指針變量。 它的用法和一般的指針沒什么不 同。本節(jié)將詳細(xì)解釋結(jié)構(gòu)指針變量。10博雅學(xué)習(xí)谷 -讓信息技術(shù)更容易教信息技術(shù), 更有效地學(xué)習(xí)信息技術(shù)結(jié)構(gòu)指針變量在使用結(jié)構(gòu)指針變量之前,首先需要定義結(jié)構(gòu)指針。結(jié)構(gòu)指針的定 義方式與通用指針相似。 例如,下面的語句定義了一個(gè)學(xué)生類型指針struct student s = struct student * p =在上面的代碼中,定義了一個(gè)結(jié)構(gòu)指針p。通過“8 void main()9 10 11 12 13 strut 學(xué)生 s = struct 學(xué)生 * p =prin tf(

22、 charname50;學(xué)生間差異;的運(yùn)行結(jié)果如圖 9-10 所示圖 9-10 運(yùn)行結(jié)果在示例9-6中,首先定義結(jié)構(gòu)類型變量 S,并將變量S中的成員名 稱初始化為張三, 并將 studentID 初始化為 20140000 然后, 定義一個(gè) 結(jié)構(gòu)指針p,并將p指向s的地址。最后,通過p->name訪問成員名 和 studentID 的值從圖 9-10 可以看出,也可以使用結(jié)構(gòu)指針來訪問結(jié) 構(gòu)變量中的成員。結(jié)構(gòu)數(shù)組指針指針可以指向結(jié)構(gòu)數(shù)組,即結(jié)構(gòu)數(shù)組的起始地址分配給指針變量。 這個(gè)指針是結(jié)構(gòu)數(shù)組指針。例如,下面的語句定義了一個(gè)Student 結(jié)構(gòu)數(shù)組和該數(shù)組的指針結(jié)構(gòu)學(xué)生學(xué)習(xí) 1 10 ,

23、 * p =在上面的代碼中, p 是一個(gè)學(xué)生結(jié)構(gòu)數(shù)組指針,從定義上看,它與結(jié) 構(gòu)指針沒有什么不同,只是指結(jié)構(gòu)數(shù)組為了幫助讀者更好地掌握結(jié)構(gòu)數(shù)組指針的用法,下面以一個(gè)案例來 演示如何使用結(jié)構(gòu)數(shù)組指針11博雅學(xué)習(xí)谷 使信息技術(shù)教學(xué)更簡(jiǎn)單,信息技術(shù)學(xué)習(xí)更有效地輸 出多個(gè)學(xué)生的信息,如例 9-7 所示。例 9-71 #包括 2 #包括 3 結(jié)構(gòu)學(xué)生 4 5整數(shù);6 char name20; 7迷人的性;8歲;9 斯圖3= 10 201401001, 11 201401002, 12 201401003, 13 void main()1415 strut student * p;16 printf( 1

24、7 for(p = stu ;“p用于獲取成員的值如圖9-11所示,程序輸出結(jié)構(gòu)數(shù)組 stu 中所有元素的成員值9.4 函數(shù)之間的結(jié)構(gòu)類型數(shù)據(jù)傳輸 不僅可以傳輸簡(jiǎn)單的變量、數(shù)組、指針和其他類型的數(shù)據(jù),還可以 在函數(shù)之間傳輸結(jié)構(gòu)類型數(shù)據(jù)本節(jié)將詳細(xì)解釋函數(shù)之間結(jié)構(gòu)類型數(shù) 據(jù)的傳輸。9.4.1 結(jié)構(gòu)變量作為函數(shù)參數(shù) 結(jié)構(gòu)變量用作函數(shù)參數(shù)的方式與普通變量相似,兩者都需要確保調(diào) 用函數(shù)的參數(shù)類型與被調(diào)用函數(shù)的參數(shù)類型相同當(dāng)結(jié)構(gòu)變量用作函 數(shù)參數(shù)時(shí),它們也是值傳遞。結(jié)構(gòu)成員變量的值在調(diào)制函數(shù)中改變,127 文科谷 -使信息技術(shù)教學(xué)更簡(jiǎn)單, 信息技術(shù)學(xué)習(xí)更有效。 主調(diào)制功能不受影響。如例 9-8 所示,例

25、9-81 #包括 2 結(jié)構(gòu)學(xué)生 3 4 56 ;7虛空變化(結(jié)構(gòu)學(xué)生)8 9 10 11 12虛空主()13 14 15 16 17 結(jié)構(gòu)學(xué)生變更(學(xué)生) ;printf( str copy(stu-> name, stu . studentid = 2; char name50;學(xué)生 間差異;的運(yùn)行結(jié)果如圖 9-12 所示圖 9-12 示例 9-8 中的運(yùn)行結(jié)果定義了一個(gè)用于更改數(shù)據(jù)的cha nge()函數(shù),該函數(shù)需要接收結(jié)構(gòu)類型的參數(shù)從代碼的第 15 行可以看出,當(dāng)結(jié)構(gòu)變量作為參數(shù)傳遞給函 數(shù)時(shí),參數(shù)的傳遞方式與普通變量相同。在主函數(shù)中調(diào)用cha nge()函數(shù)后,主函數(shù)結(jié)構(gòu)中成員的

26、值沒有改變。結(jié)構(gòu)數(shù)組作為函數(shù)參數(shù) 函數(shù)不僅可以傳遞一般結(jié)構(gòu)變量,還可以傳遞結(jié)構(gòu)數(shù)組接下來,使 用一個(gè)案例來演示如何使用結(jié)構(gòu)數(shù)組作為傳遞數(shù)據(jù)的函數(shù)參數(shù), 如示 例 9-9 所示。例 9-91 #包括 2 strut student 3 4 56 ;7 void printInfo( 結(jié)構(gòu)學(xué)生 ), int 長(zhǎng)度)8 9for(int I = 0 ; I13文科谷 -讓信息技術(shù)更容易教學(xué)。提高信息技術(shù)學(xué)習(xí)效率10 11 12 13 14 15 Void Main()16 17Struct 學(xué)生3= 18 19 20 21 Printlnfo(學(xué)生,3); printf( printf() 運(yùn)行結(jié)果

27、如圖 9-13 所示。圖 9-13 運(yùn)行實(shí)例 9-9 中的結(jié)果,因?yàn)槠溟L(zhǎng)度不能直接通過數(shù)組獲得,因此,在定義的 printfInfo() 函數(shù)中,需要傳遞兩個(gè)參數(shù),一個(gè)是結(jié)構(gòu)數(shù)組,另一個(gè)是數(shù)組的長(zhǎng)度 收到傳遞的數(shù)組名和長(zhǎng)度后, printfInfo() 函數(shù)使用 for 循環(huán)輸出結(jié)構(gòu) 數(shù)組中的所有成員結(jié)構(gòu)指針用作函數(shù)參數(shù) 結(jié)構(gòu)指針變量,以存儲(chǔ)結(jié)構(gòu)變量的第一個(gè)地址,因此當(dāng)指針作為函 數(shù)參數(shù)傳遞時(shí), 它實(shí)際上是結(jié)構(gòu)變量的第一個(gè)地址。 如果結(jié)構(gòu)成員的 值在調(diào)制函數(shù)中改變, 則主調(diào)制函數(shù)中的結(jié)構(gòu)成員的值也將改變。 如 實(shí)施例 9-10 所示例 9-101 #包括 2 strut student 3 4

28、 56 ;7 void change(strut Student * stu)8 9 10 11 12 void main()str copy(stu-> name stu-> studentID = 2; char name50; 學(xué)生間差異;14博雅研究谷 -讓信息技術(shù)更容易教學(xué),更有效地學(xué)習(xí)13 14 15 16 17 struct student = change(printf(運(yùn)行結(jié)果如圖 9-14 所示)圖 9-14 運(yùn)行結(jié)果在示例9-10中,定義了一個(gè)change()函數(shù)來更改數(shù)據(jù)。該函數(shù)需要 接收結(jié)構(gòu)指針類型的參數(shù)。 由于結(jié)構(gòu)指針用作函數(shù)參數(shù), 因此需要傳 遞結(jié)構(gòu)變

29、量的第一個(gè)地址。 因此,在代碼的第 15行,傳遞了“函”數(shù)。在上述語法格式中,“ unior是定義公共體類型的關(guān)鍵字,后面是定 義的“公共體類型名稱 ”。在“公共體類型名稱 ”下的括號(hào)中,定義了公 共體類型的成員項(xiàng),每個(gè)成員由 “數(shù)據(jù)類型”和“成員名稱”組成例如,下面的代碼 :union data int m;浮動(dòng) x ; char c; ;15博雅研究谷 -讓信息技術(shù)更容易教學(xué),更有效地進(jìn)行信息技術(shù)學(xué)習(xí)上述代碼定義了一個(gè)名為 data 的通用主體類型,它由共享相同存儲(chǔ) 空間的三種不同類型的成員組成公共體變量的定義 公共體變量的定義類似于結(jié)構(gòu)變量的定義。如果要定義公共體變量a和b的兩種數(shù)據(jù)類型

30、,可以采用以下三種方法1。首先定義公共體類型,然后定義公共體變量。具體示例如下 : 聯(lián)合數(shù)據(jù) int m ;浮點(diǎn) x;char c; ;工會(huì)數(shù)據(jù) a, b;2。定義了公共體變量,同時(shí)定義了公共體類型。具體示例如下 : 聯(lián)合數(shù)據(jù) int m; 浮動(dòng) x; char c; a , b;3,直接定義公共體類型變量,具體示例如下 :union int m; 雙 x。char c; a , b;以上三種方法都是用來定義公共體變量 A 和 B 的,它們與結(jié)構(gòu)變量 的定義相同。?再學(xué)一個(gè)技巧 :共享空間的內(nèi)存分配共享空間的內(nèi)存分配必須符合如下兩個(gè)標(biāo)準(zhǔn) :1,共享空間的內(nèi)存必須大于或等于其成員變量中的大數(shù)據(jù)類

31、型 (包括基本數(shù)據(jù)類型和數(shù)組 )的大數(shù)據(jù)類型小數(shù)據(jù)類型2,共享空間的內(nèi)存必須是最寬基本數(shù)據(jù)類型的整數(shù)倍, 否則必須填充字節(jié)接下來,通過對(duì)兩個(gè)常見物體的記憶分析來解釋上述標(biāo)準(zhǔn)。(1)成員變量都是基本數(shù)據(jù)類型的公共項(xiàng),特別是union int m;浮動(dòng) x; char c; a ;16博雅研究谷 -使信息技術(shù)教學(xué)更容易,信息技術(shù)學(xué)習(xí)更有效。公地 a 的內(nèi)存大小如圖 9-15 所示 結(jié)構(gòu)可變頭地址最大基本數(shù)據(jù)類型浮點(diǎn)大小 :4 字節(jié) 圖 9-15 公共體 a 的內(nèi)存大小公共體a的內(nèi)存大小是最大數(shù)據(jù)類型(即int和float)占用的字節(jié)數(shù), 因此公共體 a 的內(nèi)存大小為 4 字節(jié)(2)成員變量包含數(shù)組

32、類型的公共體,如下所示union int m;浮動(dòng) x ; char c; char name5; b。公共體b的內(nèi)存大小如圖9-16所示。結(jié)構(gòu)的可變頭地址字符名稱 5占用的字節(jié)大小 :5字節(jié) 3填充字節(jié) 圖 9-16 公共體 b 的內(nèi)存大小公共體 b 的內(nèi)存大小是根據(jù)最大數(shù)據(jù)類型字符名稱 5分配的,字符名稱5占用5個(gè)字節(jié)公共體B的內(nèi)存大小也必須是最寬的基本數(shù)據(jù) 類型的整數(shù)倍,因此它填充了 3 個(gè)字節(jié),總共 8 個(gè)字節(jié)。讀取器可以 通過sizeof()驗(yàn)證公共體變量的內(nèi)存大小共享卷變量的初始化和引用 在定義共享卷變量時(shí)只能初始化一個(gè)成員的類型值,這也與其內(nèi)存 分配相對(duì)應(yīng)公共體變量的初始化方法如

33、下 :union公共體類型名稱公共體變量二一個(gè)成員的類型值 從上述語法格式來看,雖然只能給一個(gè)成員賦值,但必須用大括號(hào) 括起來例如,以下語句用于初始化數(shù)據(jù)類型的公共體變量 a 17人文藝術(shù)谷 -使信息技術(shù)更易于教學(xué),對(duì)信息技術(shù)學(xué)習(xí)更有效聯(lián)合數(shù)據(jù) a = 8 ;完成公共體變量的初始化后,可以引用公共體中的成員。公共體變 量的引用方法類似于結(jié)構(gòu)。 例如,下面的代碼定義了一個(gè)公共體變量 和一個(gè)公共體指針聯(lián)合數(shù)據(jù)int m;浮動(dòng) x ; char c; ;union data a,*p=如果要引用公共體變量中的 m 個(gè)成員,可以使用以下方法 :a . m; /引用公共體變量 A 中的成員 mp->

34、;m /,引用公共體指針變量 p 指向的變量成員 m ,應(yīng)該注意的是,雖然公共體變量的引用方法與結(jié)構(gòu)的引用方法相 似,但兩者是有區(qū)別的。 主要區(qū)別在于,在程序執(zhí)行的任何特定時(shí)刻, 結(jié)構(gòu)變量的所有成員同時(shí)駐留在結(jié)構(gòu)變量占用的內(nèi)存空間中, 而公共 體變量只有一個(gè)成員駐留在公共體變量占用的內(nèi)存空間中接下來, 通 過實(shí)例進(jìn)行驗(yàn)證,如實(shí)例 9-11 所示。例 9-111 #包括 2 個(gè)聯(lián)合數(shù)據(jù) 3 4 5 6 ;7 void main()8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 printf( s address % p n printf( s addr

35、ess % p n printf( s address % p n union Data d; /定義一個(gè)聯(lián)合 d.i = 15printf( printf( printf(d . j = a );printf( printf( printf( int I ; char j;的運(yùn)行結(jié)果如圖 9-17 所示18博雅研究谷 -為了使信息技術(shù)教學(xué)更容易,信息技術(shù)學(xué)習(xí)更有效圖 9-17 操作結(jié)果在示例9-11中,定義了數(shù)據(jù)類型的公共體積變量 d。有兩個(gè)變量I 是整型的, j 是字符型的。當(dāng)我被賦給 15時(shí),此時(shí)結(jié)構(gòu) d 中只有一個(gè) 值15。I的值、j的值和結(jié)構(gòu)變量d的值在相應(yīng)的存儲(chǔ)器中實(shí)際上是 相同的

36、值。當(dāng) j 的值是字符 a 時(shí),那么此時(shí)在存儲(chǔ)器中只有對(duì)應(yīng)于 d 的字符a,并且I、j和d的值是97最后,打印D、丨和J的地址,這 三個(gè)地址是相同的, 這進(jìn)一步解釋了公共體變量在任何時(shí)候在內(nèi)存中 都應(yīng)該只有一個(gè)成員值。9.6 TypeDef-別名數(shù)據(jù)類型在前面的章節(jié)中,由 C 語言提供的各種數(shù)據(jù)類型和用戶聲明的結(jié)構(gòu)、 共享空間、指針類型等。被解釋了。除了這些數(shù)據(jù)類型, C 語言還允 許用戶使用typedef關(guān)鍵字來別名現(xiàn)有的數(shù)據(jù)類型使用typedef關(guān)鍵字 可以方便程序遷移并減少對(duì)硬件的依賴。 接下來,將詳細(xì)解釋 typedef 關(guān)鍵字。使用typedef關(guān)鍵字的的語法格式如下 :typede

37、f數(shù)據(jù)類型別名;在上述語法格式中, 數(shù)據(jù)類型包括基本數(shù)據(jù)類型、 構(gòu)造的數(shù)據(jù)類型、指針等。接下來,將詳細(xì)解釋這些項(xiàng)目。1,別名基本類型,別名int類型使用typedef關(guān)鍵字,示例代碼如下:typedef int ZX ; ZX 世,j, k;上面的語句定義int數(shù)據(jù)類型為ZX,那么ZX可以用來定義程序中的整數(shù)變量2.別名數(shù)組類型使用 typedef 關(guān)鍵字來別名數(shù)組。示例代碼如下 :typedef char NAME10 ;名稱類別 1,類別 2;上面的語句 定義了一個(gè)可以包含 10 個(gè)字符的字符數(shù)組 NAME ,并使用 NAME 定義了兩個(gè)字符數(shù)組 class1和class2,它們相當(dāng)于ch

38、ar class110和char class2103,別名結(jié)構(gòu)別名結(jié)構(gòu)類型學(xué)生使用 typedef 關(guān)鍵字,示例代碼如下 :typedef結(jié)構(gòu)學(xué)生intnum; char name10;19博雅研究谷 -讓信息技術(shù)更容易教學(xué),更有效地進(jìn)行信息技術(shù)學(xué)習(xí)char sex STU。STU stul 上面的陳述定義了學(xué)生類型的結(jié)構(gòu) STU,STUDU1 語句等效于 structure student1 ;句子應(yīng)該注意的是,使用typedef關(guān)鍵字只是別名現(xiàn)有類型,而不是定義 新類型有時(shí)宏定義可以用來替換 typedef的函數(shù),但是宏定義是通過 預(yù)處理完成的,而 typedef 是在編譯時(shí)完成的,這使得

39、使用 typedef 更加靈活。9.7 高級(jí)案例發(fā)現(xiàn)學(xué)生平均分?jǐn)?shù)在學(xué)習(xí)了結(jié)構(gòu)和普通體的相關(guān)知識(shí)后,下面是計(jì)算平均分?jǐn)?shù)以加深 對(duì)結(jié)構(gòu)的理解的案例。具體要求如下 :?一個(gè)小組有三個(gè)學(xué)生。 每個(gè)學(xué)生選修四門課程 (與三個(gè)學(xué)生相同的 課程)?在程序中輸入 3個(gè)學(xué)生的 4門課程的分?jǐn)?shù),程序自動(dòng)計(jì)算 4 門課 程的分組平均分?jǐn)?shù),然后用代碼實(shí)現(xiàn)上述功能,如例 9-12 所示。例9-121 # define _ CRT _ secure _ no _ warnings 2 # include 3 # include 45 typedef structstu 67 910 Void Main()11 12 13

40、 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /將三名學(xué)生的每個(gè)科目的成績(jī)相加, 得出 (j = 0) 的平均分?jǐn)?shù) j int i ,j; 浮動(dòng)總和 = 0,平均值;斯圖3; /定義一個(gè)包含3個(gè)元素的結(jié)構(gòu)數(shù)組/從鍵盤輸入學(xué)生的姓名和分?jǐn)?shù)(I = 0; I請(qǐng)輸入%d名學(xué)生的姓名和四門課程的成績(jī) : n scanf( for(j = 0 ; j scanf(char name20; /學(xué)生姓名浮動(dòng)分?jǐn)?shù)4; 4門課程,8 STU ;20博雅研究谷 -讓信息技術(shù)更容易教學(xué),更有效地學(xué)習(xí)28 29 30 31 32 33 34 35 36 37 系統(tǒng)(for(I = 0 ; I

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論