C語(yǔ)言數(shù)據(jù)結(jié)第9章 結(jié)構(gòu)體、共用體和枚舉_第1頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)第9章 結(jié)構(gòu)體、共用體和枚舉_第2頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)第9章 結(jié)構(gòu)體、共用體和枚舉_第3頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)第9章 結(jié)構(gòu)體、共用體和枚舉_第4頁(yè)
C語(yǔ)言數(shù)據(jù)結(jié)第9章 結(jié)構(gòu)體、共用體和枚舉_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、結(jié)構(gòu)體、共用體與枚舉結(jié)構(gòu)體、共用體與枚舉 92l了解結(jié)構(gòu)體、共用體和枚舉類型的特點(diǎn)了解結(jié)構(gòu)體、共用體和枚舉類型的特點(diǎn)l熟練掌握結(jié)構(gòu)體類型、變量、數(shù)組、指針變量熟練掌握結(jié)構(gòu)體類型、變量、數(shù)組、指針變量的定義、初始化和成員的引用方法的定義、初始化和成員的引用方法l掌握共用體和枚舉類型、變量的定義和引用掌握共用體和枚舉類型、變量的定義和引用l掌握用戶自定義類型的定義和使用掌握用戶自定義類型的定義和使用39.1 結(jié)構(gòu)體結(jié)構(gòu)體 l【問題】如何表示下面的數(shù)據(jù)?【問題】如何表示下面的數(shù)據(jù)?王云平、王云平、18歲、男、學(xué)號(hào)歲、男、學(xué)號(hào)2010010001、漢族、北京、手機(jī)號(hào)漢族、北京、手機(jī)號(hào)139010000

2、01可以定義以下變量來分別表示上面的數(shù)據(jù):可以定義以下變量來分別表示上面的數(shù)據(jù):char name10;int age;char sex3;char xh11;char nation20;char address20;char mobile20; 由于必須類型相同才能構(gòu)造成數(shù)組,顯然以由于必須類型相同才能構(gòu)造成數(shù)組,顯然以前學(xué)習(xí)的數(shù)據(jù)類型都不能很好地解決問題前學(xué)習(xí)的數(shù)據(jù)類型都不能很好地解決問題 49.1.1 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義 l結(jié)構(gòu)體類型的定義形式為:結(jié)構(gòu)體類型的定義形式為:struct 類型名類型名 成員說明表列成員說明表列 ;l例如:例如:struct student /*

3、 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 */ char name10; /*結(jié)構(gòu)體成員,以下都是結(jié)構(gòu)體成員,以下都是*/ int age; char sex3; char xh11; char nation20; char address20; char tel20; 59.1.1 結(jié)構(gòu)體類型的定義結(jié)構(gòu)體類型的定義lstruct是結(jié)構(gòu)體關(guān)鍵字,結(jié)構(gòu)體類型定義中的每個(gè)成是結(jié)構(gòu)體關(guān)鍵字,結(jié)構(gòu)體類型定義中的每個(gè)成員項(xiàng)都有確定的類型和名稱,稱為結(jié)構(gòu)體類型的員項(xiàng)都有確定的類型和名稱,稱為結(jié)構(gòu)體類型的“域域”,每個(gè)域的定義后面要有,每個(gè)域的定義后面要有“;”號(hào)。號(hào)。l結(jié)構(gòu)體類型由用戶定義,所以結(jié)構(gòu)體類型不是固定結(jié)結(jié)構(gòu)

4、體類型由用戶定義,所以結(jié)構(gòu)體類型不是固定結(jié)構(gòu)的類型,用戶可以定義不同結(jié)構(gòu)的結(jié)構(gòu)體類型,也構(gòu)的類型,用戶可以定義不同結(jié)構(gòu)的結(jié)構(gòu)體類型,也可以定義相同結(jié)構(gòu)的結(jié)構(gòu)體類型,系統(tǒng)均認(rèn)為是不同可以定義相同結(jié)構(gòu)的結(jié)構(gòu)體類型,系統(tǒng)均認(rèn)為是不同的結(jié)構(gòu)體類型,例如下面是兩個(gè)不同的結(jié)構(gòu)體類型,的結(jié)構(gòu)體類型,例如下面是兩個(gè)不同的結(jié)構(gòu)體類型,雖然雖然aa和和bb的結(jié)構(gòu)是一樣的:的結(jié)構(gòu)是一樣的:lstruct aaint a;int b;char c;lstruct bbint a;int b;char c;69.1.2 結(jié)構(gòu)體變量的定義和初始化結(jié)構(gòu)體變量的定義和初始化 l定義結(jié)構(gòu)體變量的方法可以如下:定義結(jié)構(gòu)體變量的方

5、法可以如下:l用已定義的結(jié)構(gòu)體類型名定義變量。例如:用已定義的結(jié)構(gòu)體類型名定義變量。例如:struct student wang,zhang; l在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。例如:在定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。例如:struct student /* 結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名 */ char name10; /*結(jié)構(gòu)體成員,以下都是結(jié)構(gòu)體成員,以下都是*/ int age; char sex3; char xh11; char nation20; char address20; char tel20;wang,zhang; 79.1.2 結(jié)構(gòu)體變量的定義和初始化結(jié)構(gòu)體變量的定

6、義和初始化l不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體變量。例如:不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體變量。例如:struct char name10; int age; char sex3; char xh11; char nation20; char address20; char tel20;wang,zhang;8結(jié)構(gòu)體類型的長(zhǎng)度結(jié)構(gòu)體類型的長(zhǎng)度 l結(jié)構(gòu)體類型的長(zhǎng)度可以用結(jié)構(gòu)體類型的長(zhǎng)度可以用sizeof運(yùn)算符計(jì)算出來,形運(yùn)算符計(jì)算出來,形式為:式為:lsizeof(結(jié)構(gòu)體類型名結(jié)構(gòu)體類型名) l或者或者lsizeof(變量名變量名)l如如sizeof(struct student) 或或siz

7、eof(wang),在,在tc和和vc下,結(jié)果分別是:下,結(jié)果分別是:86和和88。9結(jié)構(gòu)體類型的嵌套結(jié)構(gòu)體類型的嵌套 struct date int year; int month; int day;struct student char name10; int age; char sex3; char xh11; struct date birthday; char nation20; char address20; char tel20;wang,zhang; struct student char name10; int age; char sex2; char xh11; struc

8、t int year; int month; int day; birthday; char nation20; char address20; char tel20;wang,zhang; 10結(jié)構(gòu)體類型變量的初始化結(jié)構(gòu)體類型變量的初始化 l定義的同時(shí)初始化定義的同時(shí)初始化lstruct student wang=王云平王云平,18,男男,2010010001,漢漢族族,北京北京,zhang=張麗張麗,18,男男,2010010002,漢族漢族,廣州廣州,l注意初始化的數(shù)據(jù)及其類型要與各個(gè)成員一一對(duì)應(yīng),對(duì)于注意初始化的數(shù)據(jù)及其類型要與各個(gè)成

9、員一一對(duì)應(yīng),對(duì)于包含嵌套結(jié)構(gòu)體類型的變量,其嵌套部分的初始化也按順包含嵌套結(jié)構(gòu)體類型的變量,其嵌套部分的初始化也按順序賦初值序賦初值 lstruct student wang=王云平王云平,18,男男,2010010001,2010,3,3,漢族漢族,北京北京119.1.3 結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用 l數(shù)組元素的引用采用數(shù)組名和下標(biāo)結(jié)合的引用方法,數(shù)組元素的引用采用數(shù)組名和下標(biāo)結(jié)合的引用方法,例如例如a2、b5等。結(jié)構(gòu)體變量其成員的引用則采用等。結(jié)構(gòu)體變量其成員的引用則采用成員運(yùn)算符成員運(yùn)算符“.”來完成,格式為:來完成,格式為:l結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成

10、員名成員名l或或l結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員名結(jié)構(gòu)體成員名.結(jié)構(gòu)體成員名結(jié)構(gòu)體成員名.基本成員名基本成員名l后者是指包含嵌套的結(jié)構(gòu)體類型。后者是指包含嵌套的結(jié)構(gòu)體類型。l例如前面定義的變量例如前面定義的變量wang,其成員引用如下:,其成員引用如下:lwang.agelwang.birthday.year 12注意注意 l結(jié)構(gòu)體的成員引用的形式比普通的變量(或數(shù)組)復(fù)雜一些,結(jié)構(gòu)體的成員引用的形式比普通的變量(或數(shù)組)復(fù)雜一些,但本質(zhì)上相當(dāng)于一個(gè)普通變量(或數(shù)組),可參與該成員所屬但本質(zhì)上相當(dāng)于一個(gè)普通變量(或數(shù)組),可參與該成員所屬數(shù)據(jù)類型的一切運(yùn)算。例如:數(shù)據(jù)類型的一切運(yùn)算。例如

11、:lwang.age = 20;liage = 20;lprintf(age=%dn,wang.age);lprintf(age=%dn,iage + wang.age);ll成員運(yùn)算符成員運(yùn)算符“.”的優(yōu)先級(jí)最高,在表達(dá)式中的結(jié)構(gòu)體變量成員不的優(yōu)先級(jí)最高,在表達(dá)式中的結(jié)構(gòu)體變量成員不需要加括號(hào)。例如:需要加括號(hào)。例如:lwang.age+;l相當(dāng)于相當(dāng)于l(wang.age)+; 13注意注意l結(jié)構(gòu)體變量的成員名可以相同,但必須處在不同的層次。結(jié)構(gòu)體變量的成員名可以相同,但必須處在不同的層次。例如:例如:sturct student int no; char name20; struct i

12、nt no; char classname20; class; struct int no; char groupname20; group; wang;l上面的結(jié)構(gòu)體存在幾個(gè)相同的成員上面的結(jié)構(gòu)體存在幾個(gè)相同的成員no,但層次不同,其引,但層次不同,其引用形式能夠區(qū)別開來,引用形式分別如下:用形式能夠區(qū)別開來,引用形式分別如下:lwang.nolwang.class.nolwang.group.no 14注意注意l同一類型的結(jié)構(gòu)體變量可相互賦值。同一類型的結(jié)構(gòu)體變量可相互賦值。l我們知道,數(shù)組之間不能整體賦值,但同類型的兩我們知道,數(shù)組之間不能整體賦值,但同類型的兩個(gè)結(jié)構(gòu)體變量之間可以整體賦

13、值,這樣可以提高程個(gè)結(jié)構(gòu)體變量之間可以整體賦值,這樣可以提高程序的效率。例如:序的效率。例如:lzhang = wang;lzhang.birthday = wang.birthday;15【例【例9-1】演示結(jié)構(gòu)體類型?!垦菔窘Y(jié)構(gòu)體類型。 #include #include struct dateint year;int month;int day; ;struct studentchar name10;int age;char sex3;char xh11;struct date birthday;char nation20;char address20;char tel20;16【例【例

14、9-1】演示結(jié)構(gòu)體類型?!垦菔窘Y(jié)構(gòu)體類型。main() struct student wang = wang yunping,18,m,2010010001, 2010,3,3,han,bei jing,zhang;zhang = wang;strcpy(,zhang li);strcpy(zhang.xh,2010010002);zhang.birthday.year=2011;zhang.birthday.month=4;zhang.birthday.day=4;strcpy(zhang.address,guang zhou);strcpy(z

15、hang.tel;printf(%s,%d,%s,%s,,zhang.age,zhang.sex, zhang.xh); printf(%d,%d,%d,zhang.birthday.year,zhang.birthday.month, zhang.birthday.day);printf(%s,%s,%sn,zhang.nation,zhang.address,zhang.tel); 179.1.4 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組 l結(jié)構(gòu)體類型既可以定義單個(gè)的變量,也可結(jié)構(gòu)體類型既可以定義單個(gè)的變量,也可以定義結(jié)構(gòu)體數(shù)組,用以存儲(chǔ)批量的數(shù)據(jù)。以定義結(jié)構(gòu)體數(shù)

16、組,用以存儲(chǔ)批量的數(shù)據(jù)。 18結(jié)構(gòu)體數(shù)組的定義結(jié)構(gòu)體數(shù)組的定義l和結(jié)構(gòu)體變量定義一樣,結(jié)構(gòu)體數(shù)組的定義也和結(jié)構(gòu)體變量定義一樣,結(jié)構(gòu)體數(shù)組的定義也有以下有以下3種方法種方法 :l先定義結(jié)構(gòu)體類型,用結(jié)構(gòu)體類型名定義結(jié)構(gòu)體數(shù)組,先定義結(jié)構(gòu)體類型,用結(jié)構(gòu)體類型名定義結(jié)構(gòu)體數(shù)組,例如:例如:struct student;struct student stud50; l定義結(jié)構(gòu)體類型名的同時(shí)定義結(jié)構(gòu)體數(shù)組,例如:定義結(jié)構(gòu)體類型名的同時(shí)定義結(jié)構(gòu)體數(shù)組,例如:struct student stud50; l不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體數(shù)組,例如:不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體數(shù)組,例如:struc

17、t stud50; 19結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組的初始化l和普通數(shù)組的元素是普通變量一樣,結(jié)構(gòu)體數(shù)和普通數(shù)組的元素是普通變量一樣,結(jié)構(gòu)體數(shù)組的每一個(gè)元素相當(dāng)于一個(gè)結(jié)構(gòu)體變量,二者組的每一個(gè)元素相當(dāng)于一個(gè)結(jié)構(gòu)體變量,二者的初始化也很類似,例如:的初始化也很類似,例如:lstruct student stud2= 王云平王云平,18,男男,2010010001,漢族漢族,北京北京 張麗張麗,18,男男,2010010003,漢族漢族,廣州廣州20結(jié)構(gòu)體數(shù)組的引用結(jié)構(gòu)體數(shù)組的引用l結(jié)構(gòu)體數(shù)組元素的成員表示為:結(jié)構(gòu)體數(shù)組元素的成員表示為:l結(jié)構(gòu)體

18、數(shù)組名結(jié)構(gòu)體數(shù)組名下標(biāo)下標(biāo).成員名成員名l或或l結(jié)構(gòu)體數(shù)組名結(jié)構(gòu)體數(shù)組名下標(biāo)下標(biāo).結(jié)構(gòu)體成員名結(jié)構(gòu)體成員名.結(jié)構(gòu)體成員名結(jié)構(gòu)體成員名.成員名成員名l例如:例如:lstudi.agelstud5.birthday.yearl結(jié)構(gòu)體數(shù)組元素和類型相同的結(jié)構(gòu)體變量一樣,可相互結(jié)構(gòu)體數(shù)組元素和類型相同的結(jié)構(gòu)體變量一樣,可相互賦值。例如:賦值。例如:lstud1 = stud0;l對(duì)于結(jié)構(gòu)體數(shù)組元素內(nèi)嵌的結(jié)構(gòu)體類型成員,情況也相對(duì)于結(jié)構(gòu)體數(shù)組元素內(nèi)嵌的結(jié)構(gòu)體類型成員,情況也相同。例如:同。例如:lstudent2.birthday=student1.birthday; 21【例【例9-2】演示結(jié)構(gòu)體數(shù)組

19、的定義和應(yīng)用。】演示結(jié)構(gòu)體數(shù)組的定義和應(yīng)用。 #include #include struct dateint year;int month;int day;struct studentchar name20;int age;char sex3;char xh11;struct date birthday;char nation20;char address20;char tel20;22【例【例9-2】演示結(jié)構(gòu)體數(shù)組的定義和應(yīng)用?!垦菔窘Y(jié)構(gòu)體數(shù)組的定義和應(yīng)用。main() struct student stud3=wang yunping,18,m,2010010001,2010,3,3,

20、han,bei jing zhang li,18,m,2010010002,2011,4,4,han, guang zhougu yuping,18,f,2010010003,2012,5,5,han, shang haiint i;for(i=0;i3;i+)printf(%s,%d,%s,%s,,studi.age,studi.sex,studi.xh);printf(%d,%d,%d,studi.birthday.year,studi.birthday.month, studi.birthd

21、ay.day);printf(%s,%s,%sn,studi.nation,studi.address,studi.tel); 23【例【例9-2】用鍵盤輸入數(shù)據(jù),程序修改為】用鍵盤輸入數(shù)據(jù),程序修改為struct student stud3;int i;for(i=0;iagel因?yàn)橐驗(yàn)?p其實(shí)相當(dāng)于其實(shí)相當(dāng)于wang,所以,所以(*p).age相當(dāng)相當(dāng)于于wang.age。l“-”是一個(gè)運(yùn)算符,和是一個(gè)運(yùn)算符,和“.”優(yōu)先級(jí)相同,具優(yōu)先級(jí)相同,具有最高的優(yōu)先級(jí),用于成員的引用。有最高的優(yōu)先級(jí),用于成員的引用。27【例【例9-3】修改例】修改例9-2,利用結(jié)構(gòu),利用結(jié)構(gòu)體指針變量訪問數(shù)據(jù)。體

22、指針變量訪問數(shù)據(jù)。 struct student *p;int i;p=&wang;printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nation,p-address,p-tel);p=&stud0;for(i=0;iname,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month, p-birth

23、day.day); printf(%s,%s,%sn,p-nation,p-address,p-tel);p+;28【例【例9-3】修改例】修改例9-2,利用結(jié)構(gòu)體指,利用結(jié)構(gòu)體指針變量訪問數(shù)據(jù)。針變量訪問數(shù)據(jù)。l第第1行的輸出是行的輸出是p指向結(jié)構(gòu)體變量指向結(jié)構(gòu)體變量wang后輸出的。后輸出的。這樣的訪問方式和結(jié)構(gòu)體變量訪問方式差不多。這樣的訪問方式和結(jié)構(gòu)體變量訪問方式差不多。l第第2行至第行至第4行是行是p指向結(jié)構(gòu)體數(shù)組后輸出的。當(dāng)指向結(jié)構(gòu)體數(shù)組后輸出的。當(dāng)p指向指向&stud0,即第一個(gè)結(jié)構(gòu)體數(shù)組元素時(shí),即第一個(gè)結(jié)構(gòu)體數(shù)組元素時(shí),輸出第一個(gè)元素的所有成員;輸出第一個(gè)元素的所有成員

24、;lp+表示結(jié)構(gòu)體類型指針變量移動(dòng)一個(gè)結(jié)構(gòu)體類表示結(jié)構(gòu)體類型指針變量移動(dòng)一個(gè)結(jié)構(gòu)體類型單位,指向下一個(gè)結(jié)構(gòu)體數(shù)組元素型單位,指向下一個(gè)結(jié)構(gòu)體數(shù)組元素stud1。299.1.6 結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體與函數(shù) l結(jié)構(gòu)體類型和函數(shù)的關(guān)系表現(xiàn)在:結(jié)構(gòu)體類型和函數(shù)的關(guān)系表現(xiàn)在:l結(jié)構(gòu)體變量成員作為函數(shù)的參數(shù)。結(jié)構(gòu)體變量成員作為函數(shù)的參數(shù)。l結(jié)構(gòu)體變量作為函數(shù)的參數(shù)。結(jié)構(gòu)體變量作為函數(shù)的參數(shù)。l結(jié)構(gòu)體指針作為函數(shù)的參數(shù)。結(jié)構(gòu)體指針作為函數(shù)的參數(shù)。 30【例【例9-4】打印學(xué)號(hào)為】打印學(xué)號(hào)為20050102學(xué)生學(xué)生的年齡。的年齡。 #include #include struct dateint year;in

25、t month;int day;struct studentchar name20;int age;char sex3;char xh11;struct date birthday;char nation20;char address20;char tel20;31【例【例9-4】打印學(xué)號(hào)為】打印學(xué)號(hào)為20050102學(xué)生學(xué)生的年齡。的年齡。void showage(int age)printf(age:%dn, age);void show1(struct student s) /*結(jié)構(gòu)體變量作為形參結(jié)構(gòu)體變量作為形參*/printf(%s,%d,%s,%s,,s.age,s.s

26、ex,s.xh);printf(%d,%d,%d,s.birthday.year,s.birthday.month,s.birthday.day);printf(%s,%s,%sn,s.nation,s.address,s.tel);void show2(struct student *p) /*結(jié)構(gòu)體指針作為形參結(jié)構(gòu)體指針作為形參*/printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nat

27、ion,p-address,p-tel);void show3(struct student s,int n) /*結(jié)構(gòu)體數(shù)組作為形參結(jié)構(gòu)體數(shù)組作為形參*/int i;for(i=0;in;i+)printf(%s,%d,%s,%s,,si.age,si.sex,si.xh);printf(%d,%d,%d,si.birthday.year,si.birthday.month,si.birthday.day); printf(%s,%s,%sn,si.nation,si.address,si.tel); 32【例【例9-4】打印學(xué)號(hào)為】打印學(xué)號(hào)為20050102學(xué)生學(xué)生的年齡。的

28、年齡。void main()struct student wang =wang yunping,18,m,2010010001,2010,3,3,han,bei jing,struct student zhang=zhang li,18,m,2010010002,2011,4,4,han,guang zhoustruct student stud3=wang yunping,18,m,2010010001,2010,3,3,han,bei jingzhang li,18,m,2010010002,2011,4,4,h

29、an,guang zhougu yuping,18,f,2010010003,2012,5,5,han,shang haistruct student *p;struct student t; printf(demo showage:n);showage(wang.age); /*結(jié)構(gòu)體成員作為實(shí)參結(jié)構(gòu)體成員作為實(shí)參*/printf(demo show1:n);show1(wang);/*結(jié)構(gòu)體變量作為實(shí)參結(jié)構(gòu)體變量作為實(shí)參*/p=&wang;printf(demo show2:n);show2(p); /*結(jié)構(gòu)體指針作為實(shí)參,也可以

30、寫成結(jié)構(gòu)體指針作為實(shí)參,也可以寫成show2(&wang) */printf(demo show3:n); show3(stud,3); /*結(jié)構(gòu)體數(shù)組名作為實(shí)參結(jié)構(gòu)體數(shù)組名作為實(shí)參*/*結(jié)構(gòu)體變量交換結(jié)構(gòu)體變量交換*/t=wang;wang=zhang;zhang=t;printf(demo swap:n);show1(zhang); 33【例【例9-4】打印學(xué)號(hào)為】打印學(xué)號(hào)為20050102學(xué)生學(xué)生的年齡。的年齡。l運(yùn)行結(jié)果運(yùn)行結(jié)果34【注意注意】l由于結(jié)構(gòu)體由于結(jié)構(gòu)體struct student作為主函數(shù)之外其他作為主函數(shù)之外其他函數(shù)的形式參數(shù),所以結(jié)構(gòu)體的定義需要放在函數(shù)的形式

31、參數(shù),所以結(jié)構(gòu)體的定義需要放在函數(shù)之外,不能放在主函數(shù)函數(shù)之外,不能放在主函數(shù)main內(nèi)。內(nèi)。lshow1(wang)寫成寫成show1(stud0)效果一樣,效果一樣,結(jié)構(gòu)體數(shù)組元素也相當(dāng)于一個(gè)結(jié)構(gòu)體變量,例結(jié)構(gòu)體數(shù)組元素也相當(dāng)于一個(gè)結(jié)構(gòu)體變量,例題中正好對(duì)應(yīng)的成員數(shù)據(jù)也一樣。題中正好對(duì)應(yīng)的成員數(shù)據(jù)也一樣。l結(jié)構(gòu)體變量不同于數(shù)組體現(xiàn)在結(jié)構(gòu)體變量名需結(jié)構(gòu)體變量不同于數(shù)組體現(xiàn)在結(jié)構(gòu)體變量名需要計(jì)算才能得到結(jié)構(gòu)體數(shù)據(jù)域的地址,如要計(jì)算才能得到結(jié)構(gòu)體數(shù)據(jù)域的地址,如:l&wang。l而數(shù)組名直接代表所有數(shù)組元素的首地址,不而數(shù)組名直接代表所有數(shù)組元素的首地址,不過也可以計(jì)算得到某一個(gè)元素的地

32、址,如過也可以計(jì)算得到某一個(gè)元素的地址,如:l&stud235【例【例9-5】演示函數(shù)返回結(jié)構(gòu)體類型?!垦菔竞瘮?shù)返回結(jié)構(gòu)體類型。 struct student seek1(struct student s,int n,char name)int i;for(i=0;in;i+)if(strcmp(,name) = 0)break;return si;struct student* seek2(struct student s,int n,char name)int i;for(i=0;in;i+)if(strcmp(,name) = 0)break;retu

33、rn &si;struct student* seek3(struct student s,int n,char name)int i;struct student *p=s;for(i=0;iname,name) = 0)break;elsep+;return p;36【例【例9-5】演示函數(shù)返回結(jié)構(gòu)體類型?!垦菔竞瘮?shù)返回結(jié)構(gòu)體類型。void show1(struct student s)printf(%s,%d,%s,%s,,s.age,s.sex,s.xh);printf(%d,%d,%d,s.birthday.year,s.birthday.month,s.birt

34、hday.day);printf(%s,%s,%sn,s.nation,s.address,s.tel);void show2(struct student *p)printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nation,p-address,p-tel); 37【例【例9-5】演示函數(shù)返回結(jié)構(gòu)體類型?!垦菔竞瘮?shù)返回結(jié)構(gòu)體類型。main()struct student stud3=wan

35、g yunping,18,m,2010010001,2010,3,3,han,bei jingzhang li,18,m,2010010002,2011,4,4,han,guang zhougu yuping,18,f,2010010003,2012,5,5,han,shang haishow1(seek1(stud,3,gu yuping);show2(seek2(stud,3,zhang li);show2(seek3(stud,3,wang yunping); 389.2 共用體共用體 l為了節(jié)約內(nèi)存或便于對(duì)數(shù)

36、據(jù)進(jìn)行處理,為了節(jié)約內(nèi)存或便于對(duì)數(shù)據(jù)進(jìn)行處理,c語(yǔ)言語(yǔ)言允許不同類型的數(shù)據(jù)共享在一段存儲(chǔ)單元,這允許不同類型的數(shù)據(jù)共享在一段存儲(chǔ)單元,這種共享存儲(chǔ)單元的特殊數(shù)據(jù)類型叫做種共享存儲(chǔ)單元的特殊數(shù)據(jù)類型叫做“共用體共用體”類型,也可稱之為類型,也可稱之為“聯(lián)合聯(lián)合”類型。類型。l共用體的定義和結(jié)構(gòu)體相似,可以借鑒結(jié)構(gòu)體共用體的定義和結(jié)構(gòu)體相似,可以借鑒結(jié)構(gòu)體部分,其中不同的地方在本節(jié)中將逐一指出。部分,其中不同的地方在本節(jié)中將逐一指出。399.2.1 共用體類型的定義共用體類型的定義l共用體類型的定義形式為:共用體類型的定義形式為:union 類型名類型名 成員說明列表成員說明列表;l例如:例如:u

37、nion data char c; float f; double d; 409.2.2 共用體變量的說明和引用共用體變量的說明和引用 l與結(jié)構(gòu)體變量的說明類似,也有與結(jié)構(gòu)體變量的說明類似,也有3種方式:種方式:l先定義共用體類型,再用共用體類型定義共用體變量。先定義共用體類型,再用共用體類型定義共用體變量。union 類型名類型名 成員說明列表成員說明列表;union 類型名類型名 共用體變量名表共用體變量名表;。例如,例如,union data x;l定義共用體類型名的同時(shí)定義共用體變量。定義共用體類型名的同時(shí)定義共用體變量。union 類型名類型名 成員說明列表成員說明列表共用體變量名表

38、共用體變量名表; l不定義類型名直接定義共用體變量不定義類型名直接定義共用體變量 41注意注意 lunion data或變量或變量x,表達(dá)式,表達(dá)式sizeof(union data)和和sizeof(x)的值均為的值均為8。 42引用共用體變量引用共用體變量l引用共用體變量的形式以及注意事項(xiàng)均與引用結(jié)構(gòu)體引用共用體變量的形式以及注意事項(xiàng)均與引用結(jié)構(gòu)體變量相似,例如:變量相似,例如:lx.c /* 共用體字符型成員,相當(dāng)于普通字符型變量共用體字符型成員,相當(dāng)于普通字符型變量 */l對(duì)共用體變量中的任何一個(gè)成員賦值,都會(huì)導(dǎo)致共享對(duì)共用體變量中的任何一個(gè)成員賦值,都會(huì)導(dǎo)致共享區(qū)域數(shù)據(jù)發(fā)生變化,所以

39、共用體只能保證只有一個(gè)成區(qū)域數(shù)據(jù)發(fā)生變化,所以共用體只能保證只有一個(gè)成員的值是有效的。例如,對(duì)于共用體變量員的值是有效的。例如,對(duì)于共用體變量x,假設(shè)有:,假設(shè)有:lx.f = 3.14159;l必然使得地址必然使得地址10001011四個(gè)字節(jié)的內(nèi)容發(fā)生變化四個(gè)字節(jié)的內(nèi)容發(fā)生變化 l整體引用共用體變量沒有多大的意義,通常都是引用整體引用共用體變量沒有多大的意義,通常都是引用共用體變量的成員共用體變量的成員 43【例【例9-6】演示共用體類型的引用】演示共用體類型的引用 #include stdio.h#include string.hstruct dateint year;int month;

40、int day; ;union callchar mobile20;int telephone;struct studentchar name20;int age;char sex3;char xh11;struct date birthday;char nation20;char address20;union call callnumber; ;44【例【例9-6】演示共用體類型的引用】演示共用體類型的引用void main()struct student wang =wang yunping,18,m,2010010001,2010,3,3,han,bei jing;struct stu

41、dent li =li zhen,20,f,2010010001,2010,3,3,han,he fei;struct student *p;strcpy(wang.callnumber.mobile;li.callnumber.telephone = 56023328;p = &wang;printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nation,p-

42、address,p-callnumber.mobile);p = &li;printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%ldn,p-nation,p-address,p-callnumber.telephone); 45【例【例9-7】運(yùn)行下面的程序,分析】運(yùn)行下面的程序,分析運(yùn)行結(jié)果。運(yùn)行結(jié)果。 #include #include void main()union keycode sho

43、rt int i; char c2;key;printf(size=%dn,sizeof(key);key.i = 16961; /* 0 x4241 */printf(key.c0 = %d,key.c1=%dn,key.c0, key.c1);strcpy(key.c,ab);printf(key.c0 = %c,key.c1=%cn,key.c0, key.c1);printf(key.i = %d(0 x%x)n,key.i,key.i); 46【分析】【分析】l共用體變量共用體變量key有兩個(gè)成員:有兩個(gè)成員:short int型成員型成員i和字符和字符數(shù)組數(shù)組c,它們都占用,它們都

44、占用2字節(jié),因此共用體變量字節(jié),因此共用體變量key長(zhǎng)度長(zhǎng)度為為2字節(jié)。字節(jié)。l給給short int型成員型成員i賦值賦值16961,然后將該數(shù)據(jù)的兩個(gè),然后將該數(shù)據(jù)的兩個(gè)字節(jié)用字符數(shù)組字節(jié)用字符數(shù)組c分別輸出,低位字節(jié)分別輸出,低位字節(jié)key.c0為十六為十六進(jìn)制數(shù)進(jìn)制數(shù)42,對(duì)應(yīng)字符,對(duì)應(yīng)字符b;高位字節(jié);高位字節(jié)key.c1為十六進(jìn)為十六進(jìn)制數(shù)制數(shù)41,對(duì)應(yīng)字符,對(duì)應(yīng)字符a。l給字符數(shù)組給字符數(shù)組key.c賦值賦值ab,得到的結(jié)果和前面一樣。,得到的結(jié)果和前面一樣。由于長(zhǎng)度的限制,這里由于長(zhǎng)度的限制,這里strcpy沒能把字符串結(jié)束符存沒能把字符串結(jié)束符存入入key.c,對(duì)于本題沒有關(guān)

45、系。,對(duì)于本題沒有關(guān)系。l由此可以看出,由此可以看出,key.i被被key.c0、key.c1拆開成兩拆開成兩部分,從而分別取得其高位或低位字節(jié)部分的內(nèi)容。部分,從而分別取得其高位或低位字節(jié)部分的內(nèi)容。 479.3 枚舉類型枚舉類型 l引入引入l假設(shè)有序列假設(shè)有序列sunday、monday、tuesday、wednesday、thursday、friday、saturday,從星期的名稱上不能體現(xiàn)他們的順序,但如果將其從星期的名稱上不能體現(xiàn)他們的順序,但如果將其與下面的序列對(duì)應(yīng)就可以體現(xiàn)了:與下面的序列對(duì)應(yīng)就可以體現(xiàn)了:0、1、2、3、4、5、6。l這兩種序列都有優(yōu)點(diǎn),前者表達(dá)的意義自然明確

46、,這兩種序列都有優(yōu)點(diǎn),前者表達(dá)的意義自然明確,容易接受;后者更能體現(xiàn)星期名稱之間的順序。容易接受;后者更能體現(xiàn)星期名稱之間的順序。l能否將二者結(jié)合起來,形成一種新的數(shù)據(jù)類型?能否將二者結(jié)合起來,形成一種新的數(shù)據(jù)類型? 489.3.1 枚舉類型的定義枚舉類型的定義 l枚舉類型定義的形式為:枚舉類型定義的形式為:lenum 類型名類型名標(biāo)識(shí)符序列標(biāo)識(shí)符序列;l如:如:lenum weeksunday,monday,tuesday,wednesday,thursday,friday,saturday; lenum是定義枚舉類型的關(guān)鍵字,枚舉類是定義枚舉類型的關(guān)鍵字,枚舉類型型week包含包含7個(gè)標(biāo)識(shí)

47、符序列,分別等于個(gè)標(biāo)識(shí)符序列,分別等于0、1、2、3、4、5、6,這些標(biāo)識(shí)符常量是,這些標(biāo)識(shí)符常量是有序的。有序的。49注意注意l枚舉值標(biāo)識(shí)符是常量不是變量,這些常量是基本數(shù)據(jù)類枚舉值標(biāo)識(shí)符是常量不是變量,這些常量是基本數(shù)據(jù)類型。型。l枚舉值只能是一些標(biāo)識(shí)符,不能是基本類型常量。下面枚舉值只能是一些標(biāo)識(shí)符,不能是基本類型常量。下面的定義是錯(cuò)誤的:的定義是錯(cuò)誤的:lenum week0,1,2,3,4,5,6;l可以在定義枚舉類型時(shí)對(duì)枚舉常量重新定義值,如:可以在定義枚舉類型時(shí)對(duì)枚舉常量重新定義值,如:lenum weekmonday=1,tuesday,wednesday,thursday,f

48、riday,saturday, sunday;l這樣對(duì)應(yīng)的序列為:這樣對(duì)應(yīng)的序列為:1、2、3、4、5、6、7。l下面的定義也是可以的:下面的定義也是可以的:lenum colorblack,blue,green,red=4,yellow=14,white;l此時(shí)此時(shí)red為為4,yellow為為14,white為為15。 509.3.2 枚舉變量的定義和引用枚舉變量的定義和引用 l枚舉變量的定義枚舉變量的定義l形式可以為:形式可以為:lenum類型名類型名 變量名表變量名表; lenum類型名類型名標(biāo)識(shí)符序列標(biāo)識(shí)符序列 變量名表變量名表;lenum 標(biāo)識(shí)符序列標(biāo)識(shí)符序列 變量名表變量名表;l

49、例如:例如:lenum color backcolor;lenum color black,blue,green,red=4,yellow=14,whitebackcolor;lenum black,blue,green,red=4,yellow=14,whitebackcolor;lenum week firstweek,nextweek; 51枚舉變量的引用枚舉變量的引用 l正確的引用方式:正確的引用方式:lbackcolor = red; lbackcolor = 4;lbackcolor +; /*假設(shè)原來是假設(shè)原來是red,現(xiàn)在將變成,現(xiàn)在將變成yellow了了*/lif(backc

50、olor = red) printf(the color is redlscanf(%d,& backcolor); /*輸入一個(gè)整型數(shù)給輸入一個(gè)整型數(shù)給backcolor變量,不過必須在枚舉類型定義的范圍之內(nèi),可以是變量,不過必須在枚舉類型定義的范圍之內(nèi),可以是0、1、2、4、14、15,其他都是錯(cuò)誤的。,其他都是錯(cuò)誤的。*/l錯(cuò)誤的引用方式錯(cuò)誤的引用方式lbackcolor = 3; /*不在枚舉類型定義的范圍之內(nèi)不在枚舉類型定義的范圍之內(nèi)*/lbackcolor = grey;/*不在枚舉類型定義的范圍之內(nèi)不在枚舉類型定義的范圍之內(nèi)*/l由于枚舉變量可以作為循環(huán)變量,因此可以利用

51、循環(huán)和由于枚舉變量可以作為循環(huán)變量,因此可以利用循環(huán)和switch語(yǔ)句打印全部的枚舉值字符串。語(yǔ)句打印全部的枚舉值字符串。 52【例【例9-8】輸出全部的枚舉值字符串。】輸出全部的枚舉值字符串。 #include enum eweekmonday=1,tuesday,wednesday,thursday,friday,saturday, sunday;void main()char weekname720=sunday,monday,tuesday,wednesday,thursday,friday,saturday;enum eweek week;for(week = monday ; we

52、ek = sunday ; week+)printf(%d:%sn,week,weeknameweek%7); 539.4 用戶定義類型用戶定義類型 lc語(yǔ)言不僅提供了豐富的數(shù)據(jù)類型,還允許用語(yǔ)言不僅提供了豐富的數(shù)據(jù)類型,還允許用于自己定義類型說明符,相當(dāng)于允許用戶為數(shù)于自己定義類型說明符,相當(dāng)于允許用戶為數(shù)據(jù)類型取據(jù)類型取“別名別名”。所用的類型定義符是。所用的類型定義符是typedef。 549.4 用戶定義類型用戶定義類型l名稱替換名稱替換l定義的形式為:定義的形式為:ltypedef 類型名類型名 別名別名;l“類型名類型名”必須是系統(tǒng)提供的數(shù)據(jù)類型或用戶已定義的數(shù)據(jù)必須是系統(tǒng)提供的數(shù)

53、據(jù)類型或用戶已定義的數(shù)據(jù)類型,類型,“別名別名”是標(biāo)識(shí)符。是標(biāo)識(shí)符。l例如:例如:ltypedefint integer;ltypedefstruct studentstudent;ltypedefstructint year;int month;int day date;ltypedefchar* char; /*char* 是字符指針類型是字符指針類型*/ 559.4 用戶定義類型用戶定義類型l有了上面的替換,就可以定義相應(yīng)類型的變量了:有了上面的替換,就可以定義相應(yīng)類型的變量了:linteger a,b;/*相當(dāng)于相當(dāng)于int a,b */lstudent wang,zhang; /*相

54、當(dāng)于相當(dāng)于struct student wang,zhang; */ldate birthday; /* 相當(dāng)于相當(dāng)于structint year;int month;int day birthday;*/lchar string=hello world!; /*相當(dāng)于相當(dāng)于char * string=hello world! */lchar p=&s; /*相當(dāng)于相當(dāng)于char * p=&s */ 569.4 用戶定義類型用戶定義類型l定義數(shù)組類型定義數(shù)組類型l定義的形式為:定義的形式為:ltypedef 類型名類型名 別名別名數(shù)組長(zhǎng)度數(shù)組長(zhǎng)度;l例如:例如:ltypedef

55、 int num3;ltypedef char string20;l定義相應(yīng)類型的變量:定義相應(yīng)類型的變量:lnum a,b; /*相當(dāng)于相當(dāng)于 int a3,b3 */lstring s; /*相當(dāng)于相當(dāng)于char s20 */l就定義了該結(jié)構(gòu)體類型的變量和指針變量就定義了該結(jié)構(gòu)體類型的變量和指針變量 579.4 用戶定義類型用戶定義類型l注意:注意:l定義新類型名時(shí)一般用大寫的標(biāo)識(shí)符,以便區(qū)別于習(xí)慣的寫法,定義新類型名時(shí)一般用大寫的標(biāo)識(shí)符,以便區(qū)別于習(xí)慣的寫法,并不是必須的。并不是必須的。l用用typedef定義類型只是定義新的類型名而不是創(chuàng)建新的數(shù)據(jù)類型。定義類型只是定義新的類型名而不是

56、創(chuàng)建新的數(shù)據(jù)類型。l注意定義新類型名與宏替換的區(qū)別。例如:注意定義新類型名與宏替換的區(qū)別。例如:ltypedef int integer;l#define integer intl上述定義的作用都是用標(biāo)識(shí)符上述定義的作用都是用標(biāo)識(shí)符integer代替代替int,但實(shí)質(zhì)不同。,但實(shí)質(zhì)不同。typedef是用標(biāo)識(shí)符是用標(biāo)識(shí)符integer代替類型代替類型“int”,而,而#define是用標(biāo)是用標(biāo)識(shí)符識(shí)符integer代替字符串代替字符串“int”;typedef在編譯時(shí)解釋在編譯時(shí)解釋integer,而,而#define是在編譯之前將是在編譯之前將integer替換成字符串替換成字符串“int”

57、;typedef并不是做簡(jiǎn)單替換,例如:并不是做簡(jiǎn)單替換,例如:ltypedef int num3;l不是簡(jiǎn)單地將不是簡(jiǎn)單地將num3替換成替換成int,因?yàn)?,因?yàn)閚um a;相當(dāng)于相當(dāng)于int a3;而不而不是是int a;。 589.5 程序舉例程序舉例 l【例【例9-9】編程求兩個(gè)復(fù)數(shù)的和?!烤幊糖髢蓚€(gè)復(fù)數(shù)的和。 #includestruct complexdouble r; double i;struct complex add(struct complex x,struct complex y)struct complex z;z.r=x.r+y.r;z.i=x.i+y.i;retu

58、rn z;void main()struct complex z,add(struct complex,struct complex);struct complex x=1.2,2.5,y=2.4,5.6;z=add(x,y);printf(x+y=%.2f+%.2fin,z.r,z.i); 59【例【例9-10】已知今天的日期,編】已知今天的日期,編程求出明天的日期。程求出明天的日期。 #includestruct dateint year,month,day; ;int judge(struct date *pd)int l_year=0;if (pd-year%4=0&pd-ye

59、ar%100!=0)|pd-year%400=0)l_year=1;return l_year;int day_no(struct date *pd)int day;int month13=0,31,28,31,30,31,30,31,31,30,31,30,31;if (judge(pd)&(pd-month=2)day=29;elseday=monthpd-month;return day;60【例【例9-10】已知今天的日期,編】已知今天的日期,編程求出明天的日期。程求出明天的日期。main()struct date today,tomorrow;int judge(struct

60、 date*),day_no(struct date *);printf(enter today(yyyy,mm,dd): );scanf(%d-%d-%d,&today.year,&today.month,&today.day);if (today.day!=day_no(&today)tomorrow.day=today.day+1;tomorrow.month=today.month;tomorrow.year=today.year;else if (today.month=12)tomorrow.day=1;tomorrow.month=1;tomorrow.year=today.year+1;elsetomorrow.day=1;tomorrow.month=today.month+1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論