版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、,只能定義單一的數(shù)據(jù)類型,反映事物單一屬性,復(fù)雜數(shù)據(jù)類型,學(xué)習(xí)的意義,如定義學(xué)生成績: float score;,能定義復(fù)雜的數(shù)據(jù)類型,反映事物多個(gè)屬性,如定義學(xué)生信息: struct STU char no9; /學(xué)號(hào) char name12; /姓名 char sex; /性別 float score; /成績 student;,復(fù)雜數(shù)據(jù)類型豐富了C語言對(duì)數(shù)據(jù)信息的處理能力。 離開了復(fù)雜數(shù)據(jù)類型,很多信息的描述是無法進(jìn)行定義,更無法進(jìn)行處理的。 計(jì)算機(jī)中的信息表示更多是由復(fù)雜數(shù)據(jù)類型來定義的,象數(shù)據(jù)結(jié)構(gòu)課程中的鏈表、樹、圖等 可以更好地理解數(shù)據(jù)庫中的記錄的含義, 為C+語言中類的概念的理解
2、提供了幫助。,1、結(jié)構(gòu)體類型的定義,struct 結(jié)構(gòu)體類型名 數(shù)據(jù)類型名1 成員名1; 數(shù)據(jù)類型名2 成員名2; 數(shù)據(jù)類型名n 成員名n; ;,struct是關(guān)鍵字, 不能省略,合法標(biāo)識(shí)符 可省:無名結(jié)構(gòu)體,成員類型可以是 基本型或構(gòu)造型,以分號(hào);結(jié)尾,例1: struct Student_Info char no9; /學(xué)號(hào) char name20; /姓名 char sex; /性別 unsigned int age; /年齡 unsigned int classno; /班級(jí) float grade; /成績 ;,例2: struct Date int year; /年 int mon
3、th; /月 int day; /日 ;,在結(jié)構(gòu)體中數(shù)據(jù)類型相同的成員,既可逐個(gè)、逐行分別定義,也可合并成一行定義,就象一次定義多個(gè)變量一樣。,struct Student_Info char no9; /學(xué)號(hào) char name20; /姓名 char sex; /性別 unsigned int age; /年齡 unsigned int classno; /班級(jí) float grade; /成績 ;,struct Student_Info char no9, name20, sex; unsigned int age, classno; float grade; ;,struct Date
4、 int year; /年 int month; /月 int day; /日 ;,struct Date int year, month, day; ;,注意:結(jié)構(gòu)類型只是用戶自定義的一種數(shù)據(jù)類型,用來定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存,只有用它來定義某個(gè)變量時(shí),才會(huì)為該變量分配結(jié)構(gòu)類型所需要大小的內(nèi)存單元。,2、結(jié)構(gòu)體變量的定義和引用,struct 結(jié)構(gòu)體類型名 數(shù)據(jù)類型名1 成員名1; 數(shù)據(jù)類型名n 成員名n; ; struct 結(jié)構(gòu)體類型名 變量名列表;,結(jié)構(gòu)體變量的定義,間接定義法:先定義結(jié)構(gòu)類型,再定義結(jié)構(gòu)變量,struct student;,struct Student_Info
5、 student1, student2;,一次定義多個(gè)結(jié)構(gòu)體類型變量,定義指向結(jié)構(gòu)體類型的指針變量,struct Student_Info *pstu;,間接定義法中幾種錯(cuò)誤的結(jié)構(gòu)體變量的定義方法,沒有結(jié)構(gòu)體類型名,Student_Info student;,缺省struct關(guān)鍵字,struct Point p; struct Point int x, y; ;,結(jié)構(gòu)類型Point定義在后,2、結(jié)構(gòu)體變量的定義和引用,struct 結(jié)構(gòu)體類型名 數(shù)據(jù)類型名1 成員名1; 數(shù)據(jù)類型名n 成員名n; 變量名列表;,結(jié)構(gòu)體變量的定義,直接定義法:定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量,struct St
6、udent_Info char no9; /學(xué)號(hào) char name20; /姓名 char sex; /性別 unsigned int age; /年齡 unsigned int classno; /班級(jí) float grade; /成績 student1, student2;,struct char no9; /學(xué)號(hào) char name20; /姓名 char sex; /性別 unsigned int age; /年齡 unsigned int classno; /班級(jí) float grade; /成績 student1, student2;,或,無名結(jié)構(gòu)體定義,變量只能一次,幾點(diǎn)說明:
7、,(1) 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同 類型: 不分配內(nèi)存; 變量: 分配內(nèi)存 類型: 不能賦值、存取、運(yùn)算; 變量: 可以,(2) 結(jié)構(gòu)體可以嵌套,struct Point int x, y; ; struct Img int tag; struct Img *pimg; /正確,可以包含自身類型的指針 struct Img img; /錯(cuò)誤,不能包含自身類型的變量 ;,(3) 結(jié)構(gòu)類型中的成員名,可以與程序中的變量同名,它們代表不同的對(duì)象,互不干擾,struct Student_Info student; char name20;,(4) 結(jié)構(gòu)體類型及變量的作用域和生存期與基本類型變量相
8、同,結(jié)構(gòu)體變量的引用,引用規(guī)則,結(jié)構(gòu)體變量不能整體引用,只能引用變量成員,引用方式:,結(jié)構(gòu)體變量名.成員名 /非指針型結(jié)構(gòu)體變量的引用,可以將一個(gè)結(jié)構(gòu)體變量賦值給另一個(gè)結(jié)構(gòu)體變量,結(jié)構(gòu)體嵌套時(shí)逐級(jí)引用,結(jié)構(gòu)體指針-成員名 或 (*結(jié)構(gòu)體指針).成員名 /指針型結(jié)構(gòu)體變量的引用,成員(分量)運(yùn)算符 結(jié)合性:從左向右,成員(分量)運(yùn)算符 結(jié)合性:從左向右,結(jié)構(gòu)體變量名.成員名.子成員名最低級(jí)子成員名,注意:在利用指針引用結(jié)構(gòu)體成員時(shí),-和之間不能有空格。,3、結(jié)構(gòu)體變量的賦值,結(jié)構(gòu)體變量初始化賦值,先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量時(shí)賦初值,注意:賦初值時(shí), 中間的數(shù)據(jù)順序必須與結(jié)構(gòu)體成員的定義順
9、序一致,否則就會(huì)出現(xiàn)混亂。,struct Student_Info stu = 20020306, ZhangMing, M, 18, 1, 90;,struct Student_Info stu = 18, ZhangMing, M, 20020306, 1, 90;,3、結(jié)構(gòu)體變量的賦值,結(jié)構(gòu)體變量初始化賦值,定義結(jié)構(gòu)體類型的同時(shí),定義結(jié)構(gòu)體變量并賦初值,struct Date int year, month, day; birthday = 1986, 12, 10;,struct int year, month, day; birthday = 1986, 12, 10;,或,stru
10、ct Student_Info char no9; /學(xué)號(hào) char name20; /姓名 char sex; /性別 unsigned int age; /年齡 unsigned int classno; /班級(jí) float grade; /成績 student = 20020306, ZhangMing, M, 18, 1, 90;,strcpy (stu1.no, stu.no); strcpy (, ); stu1.sex = stu.sex; stu1.age = stu.age; stu1.classno = stu.classno; stu1.
11、grade = stu.grade;,struct Student_Info stu; strcpy (stu.no, 20020306); strcpy (, ZhangMing); stu.sex = M; stu.age = 18; stu.classno = 1; stu.grade = 90; struct Student_Info stu1; stu1 = stu;,3、結(jié)構(gòu)體變量的賦值,結(jié)構(gòu)體變量在程序中賦值,如果在定義結(jié)構(gòu)體變量時(shí)并未對(duì)其賦初始值,那么在程序中要對(duì)它賦值的話,就只能一個(gè)一個(gè)地對(duì)其成員逐一賦值,或者用已賦值的同類型的結(jié)構(gòu)體變量對(duì)它賦值,memcpy
12、 (,【例】 計(jì)算學(xué)生5門課的平均成績,最高分和最低分。,#include struct score float grade5; float avegrade, maxgrade, mingrade; ; void main ( ) int i; struct score m; printf (input the grade of five course:n); for (i = 0; i 5; i+) /輸入5門課的成績 scanf (%f, ,m.avegrade = 0; m.maxgrade = m.grade0; m.mingrade = m.grade0; for (i = 0;
13、i m.maxgrade) ? m.gradei : m.maxgrade; m.mingrade = (m.gradei m.mingrade) ? m.gradei : m.mingrade; m.avegrade /= 5; printf (avegrade = %5.1f maxgrade = %5.1f mingrade = %5.1fn, m.avegrade, m.maxgrade, m.mingrade); ,運(yùn)行結(jié)果(設(shè)5門課的成績?yōu)椋?5 80 86 90 68 ): avegrade = 79.8 maxgrade = 90.0 mingrade = 68.0, char
14、 y; int z; a;,內(nèi)存分配方法:在TC或BC編譯環(huán)境下,結(jié)構(gòu)體變量所占內(nèi)存空間的大小等于它所包含的每個(gè)成員所占內(nèi)存空間大小之和。,sizeof(a) = sizeof(a.x) + sizeof(a.y) + sizeof(a.z) = 8 + 1 + 2 = 11(byte) 或 sizeof(struct MyStruct) = sizeof(double) + sizeof(char) + sizeof(int) = 8 + 1 + 2 = 11(byte),基于TC或BC環(huán)境下的結(jié)構(gòu)體變量內(nèi)存分配,struct MyStruct double x; char y; int z
15、; a;,結(jié)構(gòu)體變量a的內(nèi)存分配示意圖:,基于VC環(huán)境下的結(jié)構(gòu)體變量內(nèi)存分配,在VC環(huán)境下,結(jié)構(gòu)體變量分配內(nèi)存的方式與TC或BC是不同的,其所占內(nèi)存空間的大小不一定等于結(jié)構(gòu)體變量所包含的每個(gè)成員所占內(nèi)存空間大小之和。,struct MyStruct double x; char y; int z; a;,問:sizeof(a) = ?,16,VC對(duì)變量存儲(chǔ)的一個(gè)特殊處理。為了提高CPU的存儲(chǔ)速度,VC對(duì)結(jié)構(gòu)體中的成員變量的起始地址做了“對(duì)齊”處理。在默認(rèn)情況下,VC規(guī)定各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量必須為該成員變量類型所占用的字節(jié)數(shù)的倍數(shù)。,基于VC環(huán)境下的結(jié)構(gòu)體變量內(nèi)存
16、分配,VC下常用數(shù)據(jù)類型的對(duì)齊方式,在VC編譯環(huán)境下,結(jié)構(gòu)體變量內(nèi)存分配方式為: (1) 結(jié)構(gòu)體變量中各成員變量在存放的時(shí)候根據(jù)在結(jié)構(gòu)體中出現(xiàn)的順序依次申請(qǐng)空間,同時(shí)按照上表的對(duì)齊方式調(diào)整位置,空缺的字節(jié)VC會(huì)自動(dòng)填充。 (2) 為了確保結(jié)構(gòu)體變量所占內(nèi)存空間的大小為結(jié)構(gòu)體的字節(jié)邊界數(shù)(即該結(jié)構(gòu)體中占用最大空間的類型所占用的字節(jié)數(shù))的倍數(shù),所以在為最后一個(gè)成員變量申請(qǐng)空間后,還會(huì)根據(jù)需要自動(dòng)填充空缺的字節(jié)。,基于VC環(huán)境下的結(jié)構(gòu)體變量內(nèi)存分配,struct MyStruct double x; char y; int z; a;,(3) 再接下來為第三個(gè)成員z分配空間,這時(shí)下一個(gè)可以分配的地址
17、對(duì)于結(jié)構(gòu)體的起始地址的偏移量為9,不是sizeof(int)=4的倍數(shù),為了滿足對(duì)齊方式對(duì)偏移量的約束問題,VC自動(dòng)填充3個(gè)字節(jié)(這三個(gè)字節(jié)沒有放什么東西),這時(shí)下一個(gè)可以分配的地址對(duì)于結(jié)構(gòu)的起始地址的偏移量為12,剛好是sizeof(int)=4的倍數(shù),所以把z存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個(gè)字節(jié);,內(nèi)存分配方法: (1) 首先為第一個(gè)成員x分配空間,其起始地址跟結(jié)構(gòu)體的起始地址相同(偏移量0,剛好為sizeof(double)的倍數(shù)),該成員變量占用sizeof(double)=8個(gè)字節(jié); (2) 接下來為第二個(gè)成員y分配空間,這時(shí)下一個(gè)可以分配的地址對(duì)
18、于結(jié)構(gòu)的起始地址的偏移量為8,是sizeof(char)的倍數(shù),所以把y存放在偏移量為8的地方滿足對(duì)齊方式,該成員變量占用sizeof(char)=1個(gè)字節(jié);,基于VC環(huán)境下的結(jié)構(gòu)體變量內(nèi)存分配,struct MyStruct double x; char y; int z; a;,這時(shí)整個(gè)結(jié)構(gòu)的成員變量已經(jīng)都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結(jié)構(gòu)的字節(jié)邊界數(shù)(即結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù)sizeof(double)=8)的倍數(shù),所以沒有空缺的字節(jié)需要填充。 整個(gè)結(jié)構(gòu)體變量占用內(nèi)存空間的大小為:sizeof(a)=8+1+3+4=16,其中有3個(gè)字節(jié)是V
19、C自動(dòng)填充的,沒有放任何有意義的東西。,基于VC環(huán)境下的結(jié)構(gòu)體變量內(nèi)存分配,空間總的大小為1+7+8+4=20,不是結(jié)構(gòu)體的字節(jié)邊界數(shù)(即結(jié)構(gòu)體中占用最大空間的類型所占用的字節(jié)數(shù)sizeof(double)=8)的倍數(shù),所以需要填充4個(gè)字節(jié),以滿足結(jié)構(gòu)體變量b所占內(nèi)存空間的大小為 sizeof(double)=8的倍數(shù)。 變量b所占內(nèi)存空間總的大小為:sizeof(b)1+7+8+4+4=24(字節(jié)),struct MyStruct char y; double x; int z; b;,使總的字節(jié)數(shù)為sizeof(double)=8的倍數(shù),5、簡化結(jié)構(gòu)體類型名,利用typedef語句為結(jié)構(gòu)體
20、類型起別名,這樣可使定義結(jié)構(gòu)體類型的變量顯得更為簡潔,同時(shí)也增加程序的易讀性。,typedef語句的格式為:,typedef 類型名 類型名的別名;,必須是已經(jīng)定義的數(shù)據(jù)類型名或C語言提供的基本類型名,必須是合法的標(biāo)識(shí)符,通常用大寫字母來表示,必須以分號(hào)結(jié)尾,typedef int INTEGER; /INTEGER是別名 typedef char * STRING /STRING是別名 struct teacher_info char name20, char sex, unit30; unsigned int age, workyears; float salary; ; typedef
21、struct teacher_info TEACHER; /TEACHER是別名 INTEGER a; /相當(dāng)于int a; STRING str; /相當(dāng)于char *str; TEACHER t; /相當(dāng)于struct teacher_info t;,typedef char ARRAY81; /ARRAY是別名 ARRAY str; /相當(dāng)于char str81;,6、結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體數(shù)組的每一個(gè)元素都是具有相同結(jié)構(gòu)體類型的下標(biāo)結(jié)構(gòu)變量。,結(jié)構(gòu)體數(shù)組的定義,三種形式:,形式一: struct Student_Info char no9, name20, sex; unsigned in
22、t age, classno; float grade; ; struct Student_Info stu10;,形式二: struct Student_Info char no9, name20, sex; unsigned int age, classno; float grade; stu10;,形式三: struct char no9, name20, sex; unsigned int age, classno; float grade; stu10;,結(jié)構(gòu)體數(shù)組與二維表的對(duì)應(yīng)關(guān)系,結(jié)構(gòu)體數(shù)組就相當(dāng)于一張二維表,一個(gè)表的框架對(duì)應(yīng)的就是某種結(jié)構(gòu)體類型,表中的每一列對(duì)應(yīng)該結(jié)構(gòu)體的成員,
23、表中每一行信息對(duì)應(yīng)該結(jié)構(gòu)體數(shù)組元素各成員的具體值,表中的行數(shù)對(duì)應(yīng)結(jié)構(gòu)體數(shù)組的大小。,結(jié)構(gòu)體類型Student_Info,struct Student_Info char no9; char name20; char sex; unsigned int age; unsigned int classno; float grade; stu10;,結(jié)構(gòu)體數(shù)組的初始化,初始化的格式為:,struct 結(jié)構(gòu)體類型名 ; struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體數(shù)組size = 初值表1, , 初值表n;,struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體數(shù)組size = 初值表1,初值表2, , 初值表n;,或,結(jié)構(gòu)體數(shù)組
24、的引用,引用格式為:,結(jié)構(gòu)體數(shù)組名下標(biāo).成員名;,struct Student_Info char no9; char name20; char sex; unsigned int age; unsigned int classno; float grade; stu10;,strcpy (, WangFei);,stu1.grade+;,printf (%s, );,【例】 輸入n個(gè)學(xué)生的基本信息,然后對(duì)學(xué)生信息按成績從高到低進(jìn)行排序,并將排序后的結(jié)果輸出。,#include #include enum SEX man,female; struct Stu
25、dent_Info char no9; /學(xué)號(hào) char name20; /姓名 enum SEX sex; /性別 unsigned int age; /年齡 unsigned int classno; /班級(jí) float grade; /成績 ; typedef struct Student_Info STUDENT; STUDENT *GetStuInfo(int i); void SortStuInfo (STUDENT *pstu, int num); void FreeMemory (STUDENT *pstu, int num);,結(jié)構(gòu)體指針數(shù)組與學(xué)生基本信息關(guān)系:,/輸入學(xué)生信息 STUDENT *GetStuInfo (int i) STUDE
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品中間商賺差價(jià)合同范例
- 訂立成本補(bǔ)償合同范例
- 物品抵賬轉(zhuǎn)讓合同范例
- 廠房機(jī)器轉(zhuǎn)買合同范例
- 身體損害合同范例
- 代理銷售紅酒合同范例
- 家具生產(chǎn)供貨合同范例
- 建設(shè)設(shè)計(jì)咨詢合同范例
- 物流車掛靠合同范例
- 預(yù)付費(fèi)消費(fèi)合同范例
- 引上管的設(shè)計(jì)及安裝要求
- 一年級(jí)美術(shù)(上冊(cè))課件-《認(rèn)識(shí)美術(shù)工具》教學(xué)課件
- GB∕T 32218-2015 真空技術(shù) 真空系統(tǒng)漏率測(cè)試方法
- 醫(yī)院建筑設(shè)計(jì)重點(diǎn)、難點(diǎn)分析及應(yīng)對(duì)措施
- 大壩樞紐工程截流施工方案
- 行政強(qiáng)制法講座-PPT課件
- 風(fēng)冷螺桿熱泵機(jī)組招標(biāo)技術(shù)要求
- 火力發(fā)電廠典型事故案例匯編
- (完整版)弱電工程安全技術(shù)交底
- 盤點(diǎn)票表格模板
- 報(bào)價(jià)單模板 Microsoft Excel 工作表
評(píng)論
0/150
提交評(píng)論