第9章結(jié)構(gòu)體等構(gòu)造數(shù)據(jù)類型_第1頁
第9章結(jié)構(gòu)體等構(gòu)造數(shù)據(jù)類型_第2頁
第9章結(jié)構(gòu)體等構(gòu)造數(shù)據(jù)類型_第3頁
第9章結(jié)構(gòu)體等構(gòu)造數(shù)據(jù)類型_第4頁
已閱讀5頁,還剩78頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、l 結(jié)構(gòu)體類型的數(shù)據(jù)由若干稱為結(jié)構(gòu)體類型的數(shù)據(jù)由若干稱為“成員成員”的數(shù)據(jù)組成,每一個成員既可以是一個基的數(shù)據(jù)組成,每一個成員既可以是一個基本數(shù)據(jù)類型的數(shù)據(jù),也可以是另一個構(gòu)造本數(shù)據(jù)類型的數(shù)據(jù),也可以是另一個構(gòu)造類型的數(shù)據(jù)。類型的數(shù)據(jù)。 結(jié)構(gòu)體實際上是結(jié)構(gòu)體實際上是C編譯沒有提供的數(shù)據(jù)編譯沒有提供的數(shù)據(jù)類型,可以由程序員根據(jù)實際情況來自己類型,可以由程序員根據(jù)實際情況來自己構(gòu)造的一種新的數(shù)據(jù)類型。構(gòu)造的一種新的數(shù)據(jù)類型。 9.1.1 結(jié)構(gòu)體的說明結(jié)構(gòu)體的說明 為了描述起來簡單,我們要先定義一為了描述起來簡單,我們要先定義一個結(jié)構(gòu)體類型:個結(jié)構(gòu)體類型:time。time是時間,是時間,10點點3

2、0分分50秒就是一個時間數(shù)據(jù),當然我們可秒就是一個時間數(shù)據(jù),當然我們可以用三個整型變量來表示一個時間,以用三個整型變量來表示一個時間,int hour;int minute;int second; 不能表示三個變量之間的邏輯關(guān)系。不能表示三個變量之間的邏輯關(guān)系。 我們把時間說明為我們把時間說明為TIME ,而,而TIME含有小時、分、秒三個成分,則含有小時、分、秒三個成分,則TIME的結(jié)的結(jié)構(gòu)體說明是:構(gòu)體說明是:struct TIME int hour; int minute; int second; 其中其中struct 是關(guān)鍵字,是關(guān)鍵字,TIME是結(jié)構(gòu)體是結(jié)構(gòu)體的類型名,它實際上規(guī)定了

3、一種新的復(fù)雜數(shù)的類型名,它實際上規(guī)定了一種新的復(fù)雜數(shù)據(jù)類型。據(jù)類型。 于是在隨后的程序中就可以使用于是在隨后的程序中就可以使用TIME定義結(jié)構(gòu)體變量了。定義結(jié)構(gòu)體變量了。struct TIME audit_begin;結(jié)構(gòu)體的說明方式:結(jié)構(gòu)體的說明方式:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 成員表;成員表; 其中成員表可以由一個或幾個成員組其中成員表可以由一個或幾個成員組成,要說明每個成員的類型和名稱,注意成,要說明每個成員的類型和名稱,注意最后用分號結(jié)束。最后用分號結(jié)束。結(jié)構(gòu)體變量的定義方式:結(jié)構(gòu)體變量的定義方式:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 結(jié)構(gòu)體變量表;結(jié)構(gòu)體變量表; 結(jié)構(gòu)體說明要注意下面幾

4、點:結(jié)構(gòu)體說明要注意下面幾點:(1)結(jié)構(gòu)體說明并不引起存儲分配,結(jié)構(gòu)體結(jié)構(gòu)體說明并不引起存儲分配,結(jié)構(gòu)體變量的定義才引起存儲分配。存儲分配時,變量的定義才引起存儲分配。存儲分配時,通常按照各成員在結(jié)構(gòu)體說明中出現(xiàn)的先通常按照各成員在結(jié)構(gòu)體說明中出現(xiàn)的先后順序依次排列。結(jié)構(gòu)體成員的數(shù)據(jù)類型后順序依次排列。結(jié)構(gòu)體成員的數(shù)據(jù)類型可以是可以是C語言的基本數(shù)據(jù)類型,也可以語言的基本數(shù)據(jù)類型,也可以是數(shù)組和指針類型。是數(shù)組和指針類型。(2) 結(jié)構(gòu)體成員還可以是另一個結(jié)構(gòu)體類型,結(jié)構(gòu)體成員還可以是另一個結(jié)構(gòu)體類型,結(jié)構(gòu)體說明可以嵌套。結(jié)構(gòu)體說明可以嵌套。struct OBJECT struct TASK l

5、ong plan; long start; long finish; ti,tj; int count; ; OBJECT中嵌套定義了另外一個結(jié)構(gòu)體中嵌套定義了另外一個結(jié)構(gòu)體TASK。(3) 結(jié)構(gòu)體說明不允許遞歸,也就是不允結(jié)構(gòu)體說明不允許遞歸,也就是不允許在一個結(jié)構(gòu)體說明中嵌套對自己的定義。許在一個結(jié)構(gòu)體說明中嵌套對自己的定義。struct WRONG struct WRONG a; /*錯誤錯誤 */ int count; ;9.1.2 結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量的定義結(jié)構(gòu)體變量定義有三種方法。結(jié)構(gòu)體變量定義有三種方法。 第一種方法就是上面用過的:先說明結(jié)構(gòu)第一種方法就是上面用過的:先說明

6、結(jié)構(gòu)體,再定義結(jié)構(gòu)體變量。體,再定義結(jié)構(gòu)體變量。 第二種方法是在說明結(jié)構(gòu)體類型的同時定第二種方法是在說明結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。義結(jié)構(gòu)體變量。例如:例如:struct TIME int hour; int minute; int second; audit_begin,audit_end; 這種方法的語法格式是:這種方法的語法格式是: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)體變量,并且不用指定結(jié)構(gòu)體名。struct int hour; int

7、 minute; int second; audit_begin,audit_end;這種形式的語法為:這種形式的語法為: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)體名實際上標識了程序員定義的一種新的數(shù)據(jù)類型,編譯系統(tǒng)不可能義的一種新的數(shù)據(jù)類型,編譯系統(tǒng)不可能為結(jié)構(gòu)體名分配內(nèi)存空間。只有當變量被為結(jié)構(gòu)體名分配內(nèi)存空間。只有當變量被說明為這種由程序員自己定義的數(shù)據(jù)類型說明為這種由程序員自己定義的數(shù)據(jù)類型的結(jié)構(gòu)體時,編譯系統(tǒng)才會為結(jié)構(gòu)體變量的結(jié)構(gòu)體時,編譯系統(tǒng)才會為結(jié)

8、構(gòu)體變量分配存儲空間。在不引起混淆的情況下,分配存儲空間。在不引起混淆的情況下,結(jié)構(gòu)體變量可以簡稱為結(jié)構(gòu)體。結(jié)構(gòu)體變量可以簡稱為結(jié)構(gòu)體。9.1.3 結(jié)構(gòu)體成員的引用結(jié)構(gòu)體成員的引用 C語言中對結(jié)構(gòu)體變量的使用是通過語言中對結(jié)構(gòu)體變量的使用是通過對其成員的引用來實現(xiàn)的。一般不能對對其成員的引用來實現(xiàn)的。一般不能對結(jié)構(gòu)體變量進行整體的引用。結(jié)構(gòu)體變量進行整體的引用。引用的方法:引用的方法: 結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名 符號符號“.”是依據(jù)結(jié)構(gòu)體變量名存取結(jié)是依據(jù)結(jié)構(gòu)體變量名存取結(jié)構(gòu)體成員的運算符。構(gòu)體成員的運算符。例例9.1 用用符號符號“.”引用結(jié)構(gòu)體變量的成員。引用結(jié)構(gòu)體變量的成員

9、。#include stdio.hvoid main() struct TIME int hour; int minute; int second; struct TIME audit_begin; audit_begin.hour=8; /*為為audit_begin的每個成員賦值的每個成員賦值 */ audit_begin.minute=30; audit_begin.second=00; printf(n audition time is %02d:%02d:%02d, audit_begin.hour,audit_begin.minute, audit_begin.second); 注

10、意,注意,對嵌套結(jié)構(gòu)體的引用必須引用對嵌套結(jié)構(gòu)體的引用必須引用到最末一級。到最末一級。struct OBJECT struct TASK long plan; long start; long finish; ti,tj; int count; ob; 可以使用可以使用scanf(“%d”,&ob.ti.plan) 輸輸入數(shù)據(jù)。入數(shù)據(jù)。但是不能引用但是不能引用ob.ti 。9.1.4 結(jié)構(gòu)體的初始化結(jié)構(gòu)體的初始化 對結(jié)構(gòu)體變量的初始化與對數(shù)組的對結(jié)構(gòu)體變量的初始化與對數(shù)組的初始化相似,因為存儲分配時,通常按照初始化相似,因為存儲分配時,通常按照各成員在結(jié)構(gòu)體中出現(xiàn)的先后順序連續(xù)排各成員

11、在結(jié)構(gòu)體中出現(xiàn)的先后順序連續(xù)排列。列。struct TIME audit_begin=8,30,0; 如果初始化數(shù)值的個數(shù)小于結(jié)構(gòu)體成如果初始化數(shù)值的個數(shù)小于結(jié)構(gòu)體成員的個數(shù),系統(tǒng)會自動將其它成員初始化員的個數(shù),系統(tǒng)會自動將其它成員初始化為為0。例例9.2 結(jié)構(gòu)體變量的初始化。結(jié)構(gòu)體變量的初始化。#include stdio.hvoid main() struct TIME int hour; int minute; int second; ; struct TIME audit_begin=8,30,0; printf(n audition time is %02d:%02d:%02d, a

12、udit_begin.hour, audit_begin.minute, audit_begin.second); 9.2 結(jié)構(gòu)體與數(shù)組結(jié)構(gòu)體與數(shù)組 9.2.1結(jié)構(gòu)體包含數(shù)組結(jié)構(gòu)體包含數(shù)組 由于結(jié)構(gòu)體的成員可以是任何基由于結(jié)構(gòu)體的成員可以是任何基本數(shù)據(jù)類型和另外一個構(gòu)造類型,所本數(shù)據(jù)類型和另外一個構(gòu)造類型,所以結(jié)構(gòu)體的成員當然可以是數(shù)組。以結(jié)構(gòu)體的成員當然可以是數(shù)組。 下面我們說明一個可以描述一個股票下面我們說明一個可以描述一個股票信息的結(jié)構(gòu)體:信息的結(jié)構(gòu)體: struct STOCK char stockname8; /*股票名稱股票名稱 */ char stockcode6; /*股票代碼

13、股票代碼 */ float price3; /*買買 入價、賣出價、成交價入價、賣出價、成交價 */;例例9.3 結(jié)構(gòu)體中包含數(shù)組。結(jié)構(gòu)體中包含數(shù)組。#include stdio.hvoid main() int i; struct STOCK char stockname16; /*股票名稱股票名稱 */ char stockcode7; /*股票代碼股票代碼 */ float price3; /*買入價、賣出價、成交價買入價、賣出價、成交價 */ ; Struct STOCK sfz=ShenFaZhan,000001,8.77,8.78,8.78;/*用深發(fā)展的數(shù)據(jù)初始化結(jié)構(gòu)體變量用深發(fā)

14、展的數(shù)據(jù)初始化結(jié)構(gòu)體變量sfz*/ printf(n %s %s , sfz.stockname, sfz .stockcode); /*輸出股票名稱和股票代碼輸出股票名稱和股票代碼 */ for (i=0;i3;i+) /*輸出股票的輸出股票的買入價、賣出價和成交價買入價、賣出價和成交價*/ printf(%6.2f , sfz.pricei);9.2.2 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 一個結(jié)構(gòu)體變量只能存放一個結(jié)一個結(jié)構(gòu)體變量只能存放一個結(jié)構(gòu)體數(shù)據(jù),假設(shè)有構(gòu)體數(shù)據(jù),假設(shè)有4個股票(或者更個股票(或者更多)的信息要描述,如何處理呢?多)的信息要描述,如何處理呢? 每一支股票用一個結(jié)構(gòu)體變量來存儲,每

15、一支股票用一個結(jié)構(gòu)體變量來存儲,四個就要用四個結(jié)構(gòu)體變量來存儲,這四四個就要用四個結(jié)構(gòu)體變量來存儲,這四個結(jié)構(gòu)體變量的構(gòu)成是完全一樣的。個結(jié)構(gòu)體變量的構(gòu)成是完全一樣的。 很容易想到用結(jié)構(gòu)體數(shù)組:很容易想到用結(jié)構(gòu)體數(shù)組:struct STOCK stock4; 定義結(jié)構(gòu)體數(shù)組的語法:定義結(jié)構(gòu)體數(shù)組的語法: struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 數(shù)組名數(shù)組名長度長度; 訪問結(jié)構(gòu)體數(shù)組中的結(jié)構(gòu)體成員訪問結(jié)構(gòu)體數(shù)組中的結(jié)構(gòu)體成員的方法是:的方法是: 數(shù)組名數(shù)組名下標下標.成員名成員名例例9.4 輸入四支股票的信息并輸出。輸入四支股票的信息并輸出。#include stdio.hvoid main() int

16、 i,j; float temp; struct STOCK char stockname16; /*股票名稱股票名稱 */ char stockcode7; /*股票代碼股票代碼 */ float price3; /*買入價、賣出價、成交價買入價、賣出價、成交價*/ ; struct STOCK stock4; for (i=0;i4;i+) printf(Please enter stockname,stockcode and 3 price:n); scanf(%s%s, stocki.stockname, stocki.stockcode); for (j=0;j3;j+) /*輸入股

17、票的買入價、賣出價輸入股票的買入價、賣出價 和成交價和成交價 */ scanf(%f, &temp); /*讀入價格讀入價格 */ stocki.pricej=temp; for (i=0;i4;i+) printf(n %s %s , stocki.stockname, stocki .stockcode); for (j=0;j”,另一種是使,另一種是使用用運算符運算符“*”。l運算符運算符“-”由由“減號減號”和和“大于號大于號”構(gòu)成。構(gòu)成。用用運算符運算符“-”引用指針所指的結(jié)構(gòu)體成員的引用指針所指的結(jié)構(gòu)體成員的方法是:方法是: 結(jié)構(gòu)體指針變量名結(jié)構(gòu)體指針變量名-成員名成員名

18、b-hour 對應(yīng)對應(yīng) begin.hour, b-minute 對應(yīng)對應(yīng) begin.minute b-second 對應(yīng)對應(yīng) begin.second。 l使用使用“*”運算符也可以通過指向結(jié)構(gòu)體變運算符也可以通過指向結(jié)構(gòu)體變量的指針訪問結(jié)構(gòu)體成員。用運算符量的指針訪問結(jié)構(gòu)體成員。用運算符“*”引引用指針所指的成員的方法是:用指針所指的成員的方法是: (*結(jié)構(gòu)體指針變量名結(jié)構(gòu)體指針變量名).成員名成員名 (*b).hour 對應(yīng)對應(yīng) begin.hour, (*b).minute 對應(yīng)對應(yīng) begin.minute, (*b).second 對應(yīng)對應(yīng) begin.second。l注意:必須

19、用圓括號將注意:必須用圓括號將*b括起來,因為括起來,因為按照優(yōu)先級和結(jié)合性,按照優(yōu)先級和結(jié)合性, (*b.hour)將解釋為將解釋為*(b. hour ),這是沒有意義的。,這是沒有意義的。l兩種方法中比較常用的是第一種,要注意兩種方法中比較常用的是第一種,要注意的是:的是:“-”不是應(yīng)用于結(jié)構(gòu)體的,而是應(yīng)不是應(yīng)用于結(jié)構(gòu)體的,而是應(yīng)用于指向結(jié)構(gòu)體的指針的。用于指向結(jié)構(gòu)體的指針的。例例9.5 使指向結(jié)構(gòu)體變量的指針。使指向結(jié)構(gòu)體變量的指針。#include stdio.hvoid main() struct TIME int hour; int minute; int second; *p;

20、struct TIME audit_begin=8,30,0; /*初始化初始化audit_begin */ p=&audit_begin; printf(“n audition time is %02d:%02d:%02d”, p- hour,p-minute,(*p).second);例例9.6用姓名、工資和年齡描述一個人的情況,編寫程序用姓名、工資和年齡描述一個人的情況,編寫程序輸入輸入5個人的情況,為每個人增加工資個人的情況,為每個人增加工資30%、年齡加一、年齡加一歲,輸出修改后的結(jié)果。歲,輸出修改后的結(jié)果。#include stdio.h #define SIZE 5voi

21、d main() struct staff char name20; int salary; int age; attendSIZE; struct staff *ap; putchar(n); for (ap=attend;apname,&(ap-salary),&(ap-age); for (ap= attend;apage+; /*年齡增加一歲年齡增加一歲 */ ap-salary*=(1+.3); /*工資增加工資增加30% */ for (ap= attend;apname), (ap-salary),(ap-age);9.3.2 結(jié)構(gòu)體中的成員包含指針結(jié)構(gòu)體中的成員

22、包含指針例例9.7 初始化一組股票名稱和股票代碼,在程序初始化一組股票名稱和股票代碼,在程序中輸出。中輸出。#include stdio.hvoid main() int i; struct STOCK2 long stockcode; /*股票代碼股票代碼 */ char *stockname; /*股票名稱股票名稱 */ ; static struct STOCK2 stock4= 1,ShenFaZhan, 96,GuangJuNengYuan, 600868,MeiYanGuFen, 66,ChangChengDianNao; for (i=0;inext=q; q-next=NULL

23、; printf(n%20s %06ld ,p-stockname, p-stockcode); printf(n%20s %06ld ,(p-next)-stockname,(p-next)-stockcode);例例9.11鏈接兩個動態(tài)分配的結(jié)構(gòu)體變量。鏈接兩個動態(tài)分配的結(jié)構(gòu)體變量。#include stdio.h#include alloc.h#include string.hvoid main() struct STOCK2 long stockcode; /*股票代碼股票代碼 */ char stockname20; /*股票名稱股票名稱 */ struct STOCK2 *next

24、; /*指向一個象自己一樣的結(jié)構(gòu)體變量指向一個象自己一樣的結(jié)構(gòu)體變量*/ *p; p=(struct STOCK2*)malloc(sizeof(struct STOCK2); /*動態(tài)分配一個結(jié)構(gòu)體變量,用動態(tài)分配一個結(jié)構(gòu)體變量,用p指向它指向它 l if (p=NULL) return;l p-stockcode=1;l strcpy(p-stockname,ShenFaZhan);l p-next=(struct STOCK2*)malloc(sizeof(struct STOCK2); /*動態(tài)分配另一個結(jié)構(gòu)體變量,用動態(tài)分配另一個結(jié)構(gòu)體變量,用p-next指向它指向它*/l if (

25、p-next=NULL) return;l p-next- stockcode =96;l strcpy(p-next-stockname,GuangJuNengYuan);l p-next-next=NULL; l /*第二個結(jié)構(gòu)體變量的第二個結(jié)構(gòu)體變量的next項設(shè)置為空指針項設(shè)置為空指針 */l printf(n%20s %06ld ,p-stockname, p-stockcode);l printf(n%20s %06ld ,l (p-next)-stockname,(p-next)-stockcode);l9.4 結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù)9.4.1 結(jié)構(gòu)體數(shù)據(jù)作為函數(shù)的參數(shù)結(jié)構(gòu)體數(shù)

26、據(jù)作為函數(shù)的參數(shù)結(jié)構(gòu)體數(shù)據(jù)作為函數(shù)的參數(shù)分為兩種情況:結(jié)構(gòu)體數(shù)據(jù)作為函數(shù)的參數(shù)分為兩種情況:(1) 結(jié)構(gòu)體變量的每個成員作為函數(shù)的實際結(jié)構(gòu)體變量的每個成員作為函數(shù)的實際參數(shù)參數(shù)(2) 指向結(jié)構(gòu)體的指針作為函數(shù)的實際參數(shù)指向結(jié)構(gòu)體的指針作為函數(shù)的實際參數(shù) 整個結(jié)構(gòu)體變量一般不允許作為函數(shù)整個結(jié)構(gòu)體變量一般不允許作為函數(shù)的實際參數(shù)(有些編譯系統(tǒng)允許)。的實際參數(shù)(有些編譯系統(tǒng)允許)。例例9.13 結(jié)構(gòu)體數(shù)據(jù)作為函數(shù)的參數(shù)。結(jié)構(gòu)體數(shù)據(jù)作為函數(shù)的參數(shù)。#include stdio.hvoid show1(long code,char *name);void show2(struct STOCK2 *p

27、,int size);struct STOCK2 /*在函數(shù)外部說明結(jié)構(gòu)體在函數(shù)外部說明結(jié)構(gòu)體 */ long stockcode; char stockname20;void main() static struct STOCK2 stock4= 1,ShenFaZhan, 96,GuangJuNengYuan, 600868,MeiYanGuFen, 66,ChangChengDianNao; show1(stock0.stockcode, stock0.stockname); show2(stock,4); void show1(long code,char *name) printf(

28、%20s %06ldn, name ,code);void show2(struct STOCK2 *p,int size) struct STOCK2 *q; for (q=p;qstockname , q-stockcode);9.4.2 返回指向結(jié)構(gòu)體的指針的函數(shù)返回指向結(jié)構(gòu)體的指針的函數(shù) 函數(shù)能夠返回指向結(jié)構(gòu)體的指針。函數(shù)能夠返回指向結(jié)構(gòu)體的指針。若要函數(shù)返回指向結(jié)構(gòu)體的指針,函若要函數(shù)返回指向結(jié)構(gòu)體的指針,函數(shù)定義的首部應(yīng)定義為:數(shù)定義的首部應(yīng)定義為:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 *函數(shù)名函數(shù)名(參數(shù)表參數(shù)表)9.5 聯(lián)合體聯(lián)合體 聯(lián)合體又稱為公用體。聯(lián)合體又稱為公用體。 在編制一

29、些比較高級的程序時,有時在編制一些比較高級的程序時,有時需要把不同類型的變量放在同一存儲區(qū)域需要把不同類型的變量放在同一存儲區(qū)域內(nèi)。內(nèi)。 一個變量一個變量x,它既可以用來存儲一個,它既可以用來存儲一個單字符還可以存儲一個浮點數(shù)或是一個整單字符還可以存儲一個浮點數(shù)或是一個整數(shù),當然,在一個時間點,它只能存放其數(shù),當然,在一個時間點,它只能存放其中的一種數(shù)據(jù),新的數(shù)據(jù)覆蓋老的數(shù)據(jù),中的一種數(shù)據(jù),新的數(shù)據(jù)覆蓋老的數(shù)據(jù),新的數(shù)據(jù)是什么數(shù)據(jù)類型,新的數(shù)據(jù)是什么數(shù)據(jù)類型,x變量就是什么變量就是什么數(shù)據(jù)類型。數(shù)據(jù)類型。 要定義這種類型的變量,就必須要定義這種類型的變量,就必須首先說明一個聯(lián)合體。首先說明一個

30、聯(lián)合體。9.5.1 聯(lián)合體的說明聯(lián)合體的說明 聯(lián)合體的說明與結(jié)構(gòu)體的說明很聯(lián)合體的說明與結(jié)構(gòu)體的說明很相似,其格式為:相似,其格式為:union 聯(lián)合體名聯(lián)合體名 成員表成員表; 例如,例如,union mixed char c; float f; int i; mixed為聯(lián)合體名,與說明結(jié)構(gòu)體一樣,為聯(lián)合體名,與說明結(jié)構(gòu)體一樣,說明一個聯(lián)合體,只是說明了一種新的數(shù)說明一個聯(lián)合體,只是說明了一種新的數(shù)據(jù)類型,并不引起內(nèi)存的分配。據(jù)類型,并不引起內(nèi)存的分配。9.5.2 聯(lián)合體變量的定義聯(lián)合體變量的定義 聯(lián)合體變量的定義方法也有三種,聯(lián)合體變量的定義方法也有三種,(一一) 先說明聯(lián)合體,再定義聯(lián)

31、合體變量先說明聯(lián)合體,再定義聯(lián)合體變量(二二) 在說明聯(lián)合體類型的同時定義聯(lián)合體變在說明聯(lián)合體類型的同時定義聯(lián)合體變量量(三三) 直接定義聯(lián)合體變量。直接定義聯(lián)合體變量。 這三種方法與結(jié)構(gòu)體變量的定義方法這三種方法與結(jié)構(gòu)體變量的定義方法幾乎沒有區(qū)別。幾乎沒有區(qū)別。union mixed char c; float f; int i;union mixed x;union char c; float f; int i; x;union mixed char c; float f; int I x; 與結(jié)構(gòu)體變量不同的是,聯(lián)合體與結(jié)構(gòu)體變量不同的是,聯(lián)合體變量在內(nèi)存中所占的字節(jié)數(shù)是成員表變量在內(nèi)存

32、中所占的字節(jié)數(shù)是成員表中最大的,而不象結(jié)構(gòu)體變量是所有中最大的,而不象結(jié)構(gòu)體變量是所有成員所占字節(jié)數(shù)的總和。成員所占字節(jié)數(shù)的總和。union mixed x=a; 這時,系統(tǒng)按成員這時,系統(tǒng)按成員c對第一個字對第一個字節(jié)賦值,其余單元的值為節(jié)賦值,其余單元的值為0。9.5.3聯(lián)合體變量成員的引用聯(lián)合體變量成員的引用 對于聯(lián)合體變量成員的直接引對于聯(lián)合體變量成員的直接引用是使用運算符用是使用運算符“.”,語法是:聯(lián)合,語法是:聯(lián)合體變量名體變量名.成員名。成員名。 例如例如x.f,可以將,可以將x.f看成一個普看成一個普通的浮點型數(shù)據(jù)進行存取。通的浮點型數(shù)據(jù)進行存取。注意:注意: 不能對聯(lián)合體變

33、量不能對聯(lián)合體變量x直接存取內(nèi)直接存取內(nèi)容。容。 x=15.00是錯誤的,只能對是錯誤的,只能對x的三的三個成員進行操作,這三個成員是個成員進行操作,這三個成員是x.f、x.i和和x.c,并且這三個聯(lián)合體成員不可,并且這三個聯(lián)合體成員不可能同時存在。能同時存在。9.5.3聯(lián)合體變量成員的引用聯(lián)合體變量成員的引用 對于聯(lián)合體變量成員的直接引對于聯(lián)合體變量成員的直接引用是使用運算符用是使用運算符“.”,語法是:聯(lián)合,語法是:聯(lián)合體變量名體變量名.成員名。成員名。 例如例如x.f,可以將,可以將x.f看成一個普看成一個普通的浮點型數(shù)據(jù)進行存取。通的浮點型數(shù)據(jù)進行存取。例如,在下面的程序中,執(zhí)行語句例

34、如,在下面的程序中,執(zhí)行語句x.i=10;以后以后x.f的值是不能夠確定的。的值是不能夠確定的。 #include stdio.h union mixed char c; float f; int i; ; void main() union mixed x; x.i=10; printf(%f,x.f); /*x.f的值不確定的值不確定 */ 9.5.4指向聯(lián)合體變量的指針指向聯(lián)合體變量的指針 通過指向聯(lián)合體變量的指針也通過指向聯(lián)合體變量的指針也可以對聯(lián)合體變量進行存取,使用可以對聯(lián)合體變量進行存取,使用指向聯(lián)合體變量的指針存取聯(lián)合體指向聯(lián)合體變量的指針存取聯(lián)合體變量成員的語法格式是:變量成

35、員的語法格式是:(*指向聯(lián)合體變量的指針指向聯(lián)合體變量的指針).成員名成員名指向聯(lián)合體變量的指針指向聯(lián)合體變量的指針-成員名成員名例例9.19 使用指針引用聯(lián)合體的成員。使用指針引用聯(lián)合體的成員。#include stdio.hunion STOCK3 long stockcode; /*股票代碼股票代碼 */ char *stockname; /*股票名稱股票名稱 */ ;void main() union STOCK3 st,*p=&st; st.stockname=ShenFanZhan; printf(nstockname is %s, p-stockname); /*通過指針

36、引用聯(lián)合體變量的成員通過指針引用聯(lián)合體變量的成員 */9.5.5 聯(lián)合體變量與函數(shù)聯(lián)合體變量與函數(shù) 聯(lián)合體變量的成員值可以作為函聯(lián)合體變量的成員值可以作為函數(shù)的參數(shù),聯(lián)合體變量不能作為函數(shù)數(shù)的參數(shù),聯(lián)合體變量不能作為函數(shù)的參數(shù),并且函數(shù)的返回類型也不能的參數(shù),并且函數(shù)的返回類型也不能是聯(lián)合體;但是,指向聯(lián)合體變量的是聯(lián)合體;但是,指向聯(lián)合體變量的指針可以作為函數(shù)的參數(shù),返回值也指針可以作為函數(shù)的參數(shù),返回值也可以是指向聯(lián)合體變量的指針??梢允侵赶蚵?lián)合體變量的指針。9.6 枚舉枚舉 使用枚舉變量的主要目的是提高使用枚舉變量的主要目的是提高程序的可讀性,所謂程序的可讀性,所謂“枚舉枚舉”就是把所就

37、是把所有可能的取值情況列舉出來。例如,有可能的取值情況列舉出來。例如,真和假表示了邏輯值的兩種情況,男真和假表示了邏輯值的兩種情況,男和女是性別的兩種取值,選修課成績和女是性別的兩種取值,選修課成績有有“優(yōu)優(yōu)”、“良良”、“中中”、“及格及格”和和“不及格不及格”五種取值。五種取值。 9.6.1 枚舉的說明和枚舉變量的定義枚舉的說明和枚舉變量的定義枚舉的說明格式為:枚舉的說明格式為:enum 枚舉名枚舉名 枚舉元素表(逗號分隔)枚舉元素表(逗號分隔);enum color red,green,blue,yellow,white;enum bool false,true; 枚舉元素是常量,有固定

38、的數(shù)值,枚舉元素是常量,有固定的數(shù)值,按枚舉的順序分別是整數(shù)按枚舉的順序分別是整數(shù)0、1、2,不,不能將其當作變量使用,也就是說不能在能將其當作變量使用,也就是說不能在賦值號的左邊使用枚舉元素。賦值號的左邊使用枚舉元素。 例如,例如,true=1;是錯誤的。是錯誤的。注意,注意,不能有兩個相同名字的枚舉元素,不能有兩個相同名字的枚舉元素,枚舉元素也不能與其它的變量同名。枚舉元素也不能與其它的變量同名。枚舉變量的定義與結(jié)構(gòu)體相類似,也有三枚舉變量的定義與結(jié)構(gòu)體相類似,也有三種:種:(1) 與枚舉說明分開定義與枚舉說明分開定義enum 枚舉名枚舉名 變量名表;變量名表;例如:例如: enum co

39、lor red,green,blue,yellow,white; enum color select,change;select和和change是枚舉變量。是枚舉變量。(2) 與枚舉說明一起定義與枚舉說明一起定義例如:例如: enum color red,green,blue,yellow,white select,change;(3) 不說明枚舉名,直接定義枚舉變量不說明枚舉名,直接定義枚舉變量例如:例如: enum red,green,blue,yellow,white select,change; 9.6.2 枚舉變量的使用枚舉變量的使用 枚舉變量的使用與結(jié)構(gòu)體變量枚舉變量的使用與結(jié)構(gòu)體

40、變量完全不同。完全不同。 如果一個變量被定義為是一個如果一個變量被定義為是一個枚舉變量,則它的取值只能取自對枚舉變量,則它的取值只能取自對應(yīng)的枚舉元素,而不能是其它任何應(yīng)的枚舉元素,而不能是其它任何數(shù)。數(shù)。如果有定義如果有定義 enum red,green,blue,yellow,white select,change; 則則select=red;和和change=white; 都是正確的,而都是正確的,而select=red_white是是錯誤的,因為錯誤的,因為red_white并沒有在并沒有在枚舉元素表中出現(xiàn)。枚舉元素表中出現(xiàn)。 枚舉元素是常量,有固定的數(shù)值,枚舉元素是常量,有固定的數(shù)值

41、,按枚舉的順序分別是整數(shù)按枚舉的順序分別是整數(shù)0、1、2,不,不能將其當作變量使用,也就是說不能在能將其當作變量使用,也就是說不能在賦值號的左邊使用枚舉元素。賦值號的左邊使用枚舉元素。 例如,例如,true=1;是錯誤的。是錯誤的。注意,注意,不能有兩個相同名字的枚舉元素,不能有兩個相同名字的枚舉元素,枚舉元素也不能與其它的變量同名。枚舉元素也不能與其它的變量同名。 C編譯對枚舉元素作為常整數(shù)處編譯對枚舉元素作為常整數(shù)處理,遇到枚舉元素時,編譯程序把理,遇到枚舉元素時,編譯程序把其中第一個枚舉元素賦值為其中第一個枚舉元素賦值為0,第,第2個賦值為個賦值為1,所以,所以select=red;和和

42、change=white;兩句賦值語句執(zhí)行以兩句賦值語句執(zhí)行以后,后,select的值為的值為0,change的值為的值為4。 C語言允許程序員將某些枚舉元素語言允許程序員將某些枚舉元素強制賦值,指定為一整數(shù)常量,被強制強制賦值,指定為一整數(shù)常量,被強制賦值的枚舉元素后面的值按順序逐個增賦值的枚舉元素后面的值按順序逐個增1。enum color red,green,blue=5,yellow,white /*實際值為實際值為0,1,5,6,7*/; 枚舉元素是常量,有固定的數(shù)值,枚舉元素是常量,有固定的數(shù)值,按枚舉的順序分別是整數(shù)按枚舉的順序分別是整數(shù)0、1、2,不,不能將其當作變量使用,也就是說不能在能將其當作變量使用,也就是說不能在賦值

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論