下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第七章 結(jié)構(gòu)體與共用體,高級語言程序設(shè)計,計算機基礎(chǔ)教研室,本章主要內(nèi)容,本章介紹:如何自己構(gòu)造數(shù)據(jù)類型(構(gòu)造型數(shù)據(jù)) 結(jié)構(gòu)體 內(nèi)存分配函數(shù) 共用體 枚舉類型 類型定義,教學(xué)目的與要求 掌握結(jié)構(gòu)體和共同體類型的說明 結(jié)構(gòu)體和共用體變量的定義及初始化方法 掌握結(jié)構(gòu)體與共用體變量成員的引用 領(lǐng)會存儲動態(tài)分配和釋放 領(lǐng)會鏈表的基本概念和基本操作 領(lǐng)會枚舉類型變量的定義 了解Typedef的作用 重點與難點 結(jié)構(gòu)體的基本概念 結(jié)構(gòu)體類型及變量的定義 結(jié)構(gòu)數(shù)組 用指針處理鏈表 共用體及枚舉類型的基本概念 Typedef的基本概念,C(C+)數(shù)據(jù)類型,一、結(jié)構(gòu)體,1概述 數(shù) 組 是構(gòu)造類數(shù)據(jù),其數(shù)組元素必
2、須是同一數(shù)據(jù)類型的。 結(jié)構(gòu)體 也是構(gòu)造類數(shù)據(jù),但其成員可以是任何類型的。 構(gòu)造類型使用戶可以象處理單個變量一樣來處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。,諸如學(xué)生花名冊、通訊錄之類的數(shù)據(jù),最適合用結(jié)構(gòu)體來處理。因為這類數(shù)據(jù)具有如下特點: 每個人信息都是一個復(fù)合的構(gòu)造數(shù)據(jù),如由姓名、學(xué)號、性別、年齡、家庭住址、聯(lián)系電話等“成員”組成。 不同的人,數(shù)據(jù)的值不同,但都有共同的成員組成。,使用結(jié)構(gòu)體的一般步驟,根據(jù)問題的要求定義一個結(jié)構(gòu)體類型 用自己定義的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量 在程序中使用結(jié)構(gòu)體變量處理問題 比較普通變量的情況: 用系統(tǒng)給定的數(shù)據(jù)類型定義變量 在程序中使用變量處理問題,如何定義結(jié)構(gòu)體類型?,struc
3、t 結(jié)構(gòu)體名 類型標識符 成員名; ;,關(guān)鍵字 用戶指定,/*struct 結(jié)構(gòu)體名合稱“結(jié)構(gòu)類型標識符”*/,/*成員表列*/,/*此處分號不能省略*/,一個示例,【例一】 main() struct student int number; char name6; char sex; int age; char address20; ; ,本質(zhì)上,它定義了一個名為”student”的“結(jié)構(gòu)體類型”(表頭)。,小結(jié):什么是“結(jié)構(gòu)體類型”?,用戶自己定義的構(gòu)造型數(shù)據(jù)類型 由若干數(shù)據(jù)項(成員)組成 同一結(jié)構(gòu)體中的成員可以具有不同的數(shù)據(jù)類型 注意成員定義與普通變量定義的區(qū)別: 成員定義時不為其分配內(nèi)
4、存 變量定義時為其分配內(nèi)存,結(jié)構(gòu)體類型的特點:,組成結(jié)構(gòu)體的成員本身必須是一種已有定義的數(shù)據(jù): 基本類型成員(整型/字符型/實型) 指針類型成員 數(shù)組類成員 其他構(gòu)造類成員(包括已定義的另一種結(jié)構(gòu)體) 注意:成員變量,故成員名可與變量名同名 結(jié)構(gòu)體類型可以有千千萬萬種,表示由若干不同數(shù)據(jù)項組 成的復(fù)合類型。 定義結(jié)構(gòu)體類型時,系統(tǒng)不會為該結(jié)構(gòu)體分配內(nèi)存(只是定義類型,而非變量聲明),2、結(jié)構(gòu)體類型變量的定義,定義了以上結(jié)構(gòu)體類型后,struct student 相當于標準數(shù)據(jù)類型關(guān)鍵字char, int ,float我們可以用它來定義“結(jié)構(gòu)體變量”。 在結(jié)構(gòu)體類型定義后,用 struct 結(jié)構(gòu)
5、體名 復(fù)合詞定義 struct 結(jié)構(gòu)體名 ; struct 結(jié)構(gòu)體名 變量名1,變量名2, 變量名n; 如:struct student a,b30,*p; a 為struct student類型的變量 b 為struct student類型的數(shù)組(每個元素都是一個結(jié)構(gòu) 體變量,都有眾成員) p 為指向struct student類型的指針變量,還有兩種合二為一方法, 在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體類型變量 struct 結(jié)構(gòu)體名 變量名1,變量名2, 變量名n; 直接定義結(jié)構(gòu)體類型變量 struct 變量名1,變量名2, 變量名n;,實際使用中,還可以使用以下形式: 先定義 #define
6、 STU struct student 爾后 STU student1,student2;,【例二】定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體類型變量。 main() struct student int number; char name6; char sex; int age; char address20; a,b30,*p; ,【例三】不定義結(jié)構(gòu)體類型,直接定義結(jié)構(gòu)體類型變量。 main() struct int number; char name6; char sex; int age; char address20; a,b30,*p; ,其他有關(guān)知識,實際使用中,還可以使用以下形式: #de
7、fine STU struct student STU stu1,stu2; 比較一下兩種變量定義方式的異同: int a,b,c; 定義三個整型變量,每個變量占二個字節(jié),可單獨賦值。 struct student a,b,c; 定義三個結(jié)構(gòu)體類型變量,每個變量下有若干“成員”。其占用的內(nèi)存長度等于各成員項長度之和。,示例,【例四】 main() struct student int number; char name6; char sex; int age; char address20; ; printf(%dn ,sizeof(struct student); ,結(jié)果: 31,示例,【例
8、五】若有以下定義,則正確的賦值語句為 。 struct complex float real; float image; ; struct value int no; struct complex com; val1; A) com.real=1; B) plex.real=1; C) .real=1; D) val1.real=1;,答案:C).real=1,3、結(jié)構(gòu)體變量的初始化和賦值,使一個結(jié)構(gòu)體變量獲得數(shù)據(jù)“值”(實際上是給其各個成員賦值)有三種方法: 定義時初始化之 用賦值語句對各成員分別賦值 同類型的結(jié)構(gòu)體變量間相互賦值 如 student1=student2,示例: 定義時初始化
9、之,【例六】 main() struct char name15; char class12; long num; stu=Wenli,Computer,200113; printf(%sn%sn%ldn,,stu.class,stu.num); ,結(jié)果:Wenli Computer 1 200113,示例: 用賦值語句對各成員分別賦值,【例七】 main() struct char name15; char class12; long num; stu=Wenli,Computer,200113; 0=1; stu.class2=A; stu.num=1111
10、; printf(%s,%s,%dn,,stu.class,stu.num); ,結(jié)果: 1enli,CoAputer,1111,示例: 用賦值語句對各成員分別賦值,【例七】 main() struct char name15; char class12; long num; stu=Wenli,Computer 1,200113; 0=1; stu.class2=A; stu.num=1111; printf(%s,%s,%dn,,stu.class,stu.num); ,結(jié)果: 1enli,CoAputer,1111,進行所謂“結(jié)構(gòu)體變量賦值
11、”只能逐個成員進行,不能將結(jié)構(gòu)體變量作為一個整體進行輸入和輸出。如對結(jié)構(gòu)體變量stu,以下語句是錯誤的: scanf(“%s,%s,%ld”,stu); printf(“%s,%s,%ld”,stu);,正確編程: main() struct char name15; char class12; long num; stu; scanf(%s,); scanf(%s,stu.class); scanf(%ld, ,亦可用以下賦值語句: strcpy(,”wenli”); strcpy(stu.class, “Computer”); stu.num=200113;
12、,為什么啊?,但是如果改為=”wenli”是錯誤的。,4、結(jié)構(gòu)體變量的引用,只能引用其成員變量 用圓點(成員運算符)優(yōu)先級最高 如 val1.no+ sum=.real+.image 可以將成員變量按普通變量運算方式處理,包括取地址: ; unsigned months =0,31,28,31,30,31,30,31,31,30,31,30,31; main() struct datetp d; printf(請輸入年 月 日:); scanf(%u%u%u, ,答案:【1】 char name20; char sex; int age; float score; char a
13、ddr30; ; struct student stu3;,定義結(jié)構(gòu)體時同時定義 struct student int num; char name20; char sex; int age; float score; char addr30; stu3;,5、結(jié)構(gòu)體數(shù)組,初始化 P266 一般初始化 省略維數(shù) 定義后初始化,一般初始化 struct student int num; char name20; char sex; int age; float score; stu3= 10101,李寧,M,18,87.5, 10102,張凡,M,19,99, 10103,王敏,F,20,78.
14、5 ;,定義后初始化 struct student int num; char name20; char sex; int age; float score; ; Struct student stu3= 10101,李寧,M,18,87.5, 10102,張凡,M,19,99, 10103,王敏,F,20,78.5 ;,一般初始化示例,main() struct student int num; char name20; char sex; int age; float score; stu3= 10101,李寧,M,18,87.5, 10102,趙凡,M,19,99, 10103,王敏,F
15、,20,78.5 ; int i; clrscr(); for (i=0;i3;i+) printf(%s,學(xué)號%d,成績:%.2fn,,stui.num,stui.score); ,試一試運行結(jié)果,這里面的花括號能不能去掉?,6、指向結(jié)構(gòu)體類型的指針,一個結(jié)構(gòu)體變量的指針就是該變量所占據(jù)的內(nèi)存段的起始地址。 如 struct student stu; struct student *p; p=,如果 struct student stu; struct student *p; p= 則以下三種形式等價: stu.age (結(jié)構(gòu)體變量名.成員名) (*p).age (*指針變
16、量名.成員名) p-age (指針變量名.成員名) 此時: p-age+ 等效于(p-age)+ 先得 到成員值,再使它加1; +p-age 等效于 +(p-age) 先使成員 值加1,再使用之。,struct tm int hours,minutes,seconds; main() struct tm time; time.hours=time.minutes=time.seconds=0; clrscr(); printf(Now, press any key to begin my clock.); getch(); for(;) update( ,display(struct tm *
17、t) clrscr(); printf(%d:,(*t).hours); printf(%d:,(*t).minutes); printf(%dn,(*t).seconds); delay() long int t; for(t=1;t=11128000;+t); ,運行一下試試 再把例中的 (*t). 部分或全部替換為 t- 結(jié)果有什么變化?,7、鏈表,特點: 按需分配內(nèi)存 不連續(xù)存放 有一個“頭指針”(head)變量 每個結(jié)點中應(yīng)包括一個指針變量,用它存放下一結(jié)點的地址。 最后一個結(jié)點的地址部分存放一個“NULL” (空地址)。,鏈表結(jié)點定義形式,定義形式: struct student
18、int number; char name6; struct student *next; ;,鏈表操作常用技術(shù)語句,p=p-next 在鏈表結(jié)點間順序移動指針 將p原來所指結(jié)點中next的值賦給p,而p-next值即下一結(jié)點起始地址,故p=p-next 的作用是使p指向下一結(jié)點起始地址。 p2-next=p1 將新結(jié)點添加到現(xiàn)在鏈表中 如果p2是鏈表中的末結(jié)點,p1指新建結(jié)點,此句的功能是使p1所指新結(jié)點變成鏈表中的新的末結(jié)點。 p2-next=NULL 讓p2所在結(jié)點成為鏈表中最后結(jié)點,示例,若已建立下面的鏈表結(jié)構(gòu),指針p指向某單向鏈表的首結(jié)點,如下圖所示。 struct node int
19、 data; struct node *next; *p; 以下語句能正確輸出該鏈表所有結(jié)點的數(shù)據(jù)成員data的是 。,A) for ( ;p!=NULL;p+) printf(“%7d,”,p-data); B) for ( ;!p;p=p-next) printf(“%7d,”,(*p).data);,C) while (p) printf(“%7d,”,(*p).data); p=p-next; D) while (p!=NULL) printf(“%7d,”, p-data); p+; ,答案:C,鏈表指針p+表示什么?,main() struct stu int num; char
20、*name; int age; st=12,ABC,100,*p= ,結(jié)果: FFD2 FFD8 FFDE FFE4 6,結(jié)論: 若p指向某個結(jié)構(gòu)體變量,則 p+ 的功能是將指針p 移到本結(jié)點后的存儲單元,而不是本結(jié)點的下一個成員處。 所以鏈表中不能用p+進行結(jié)點間的跳轉(zhuǎn)。,靜態(tài)鏈表的建立 P274 例11.7,#define NULL 0 struct student long num; float score; struct student *next; ; main() struct student a,b,c,*head,*p; a.num=99101;a.score=89.5; b.
21、num=99103;b.score=90; c.num=99107;c.score=85; head= ,注意有關(guān)技巧: 結(jié)點是如何定義的? 結(jié)點是如何建立的? 如何使諸結(jié)點形成鏈表? 最后一個結(jié)點如何建立? 如何從一個結(jié)點轉(zhuǎn)到下一結(jié)點? 如何遍歷所有結(jié)點?,二、內(nèi)存分配函數(shù),1、“動態(tài)內(nèi)存分配”的概念 使用戶程序能在運行期間動態(tài)地申請和釋放內(nèi)存空間,從而更有效地利用內(nèi)存并提高程序設(shè)計的靈活性。 如,為了保證程序的通用性,最大需要建立一個1000個元素的字符數(shù)組,每個數(shù)組元素占30個字符,共需30000個字節(jié)存儲空間。但程序某次運行時,可能只使用30個數(shù)組元素,于是就有29100個字節(jié)的已分配
22、存儲空間被浪費。 此時,可通過動態(tài)內(nèi)存分配技術(shù),將程序設(shè)計成運行時才向計算機申請內(nèi)存,并在用完時立即釋放占用的內(nèi)存空間。 使用動態(tài)內(nèi)存分配技術(shù)建立的鏈表稱為“動態(tài)鏈表”。,2、動態(tài)內(nèi)存分配函數(shù) P275/P387,以下函數(shù)在malloc.h或stdlib.h中定義(n,x為無符號整數(shù),p為指針變量): void *malloc(x) 分配一個長度為x字節(jié)的連續(xù)空間,分配成功返回起始地址指針,分配失敗(內(nèi)存不足)返回NULL void *calloc(n,x) 分配n個長度為x字節(jié)的連續(xù)空間(成敗結(jié)果同上) void *realloc(p,x) 將p所指的已分配空間大小調(diào)整為x個字節(jié) void
23、free(p) 將由以上各函數(shù)申請的以p為首地址的內(nèi)存空間全部釋放,動態(tài)內(nèi)存分配函數(shù)使用示例,#include stdlib.h main( ) char *p; p=(char *)malloc(17); if (!p) printf(內(nèi)存分配出錯); exit(1); strcpy(p,This is 16 chars); /*如果超過16個字符,可能破壞程序其他部分*/ p=(char *)realloc(p,18); if (p=NULL) printf(內(nèi)存分配出錯); exit(1); strcat(p,.); printf(p); free(p); ,結(jié)果:This is 16
24、chars.,動態(tài)鏈表的建立和遍歷示例(后進先出的數(shù)據(jù)結(jié)構(gòu),即所謂“?!保?#define NULL 0 struct info int data; struct info *next; ; main() struct info *base,*p; int n; base=NULL;,for(n=0;ndata=n+1; p-next=base; base=p; while (p!=NULL) printf(%4d,p-data); p=p-next; ,結(jié)果:10 9 8 7 6 5 4 3 2 1,動態(tài)鏈表的建立和遍歷示例(以建立P274鏈表為例),#define NULL 0 struc
25、t info long num; int score; struct info *next; ; main() struct info *head,*p1,*p2; int n=1; clrscr();,head=p1=p2=(struct info *)malloc(sizeof(struct info); printf(請輸入第%d個同學(xué)的學(xué)號和成績:,n+); scanf(%ld,%d, ,三、共用體(聯(lián)合體),1、概述 P287 與結(jié)構(gòu)體相似,共用體也是一種用戶自己定義的構(gòu)造型數(shù)據(jù),其成員也可以具有不同的數(shù)據(jù)類型,但共用體將幾種不同的數(shù)據(jù)項存放在同一段內(nèi)存單元中。所以,每一時刻只能有一
26、個成員存在占用分配給該共用體的內(nèi)存空間(新進舊出)。該共用體的數(shù)據(jù)長度等于最長的成員長度。,如何定義共用體類型?,union 共用體名 類型標識符 成員名; ;,關(guān)鍵字 用戶指定,/*union 共用體名合稱“共用類型標識符”*/,/*成員表列*/,/*此處分號不能省略*/,示例 union data int i; char ch; float p; ;,3、共用體變量的聲明, 用union 共用體名 復(fù)合詞聲明 union 共用體名 ; union 共用體名 變量名1,變量名2, 變量名n; 在定義共用體類型的同時聲明 union 共用體名 變量名1,變量名2, 變量名n; 直接聲明共用體類
27、型變量 union 變量名1,變量名2, 變量名n;,共用體變量的引用,共用體變量的引用與結(jié)構(gòu)體相似 只能引用其成員變量,不能引用共用體變量本身 正確:printf(“%d”,data.i); 錯誤:printf(“%d”,data); 不能對共用體變量賦值,不能初始化,不能作為 函數(shù)參數(shù)! 見P289示例 允許兩個同類型共用體之間相互賦值。 可通過指針引用。,示例,main() union u_type int i; char ch6; long s; ; struct st_type union u_type u; float score3; ; printf(%dn,sizeof(str
28、uct st_type); ,結(jié)果:18,示例,main() union example struct int x; int y; in; int a2; e=0,0; e.a0=1; e.a1=2; printf(%d,%dn,e.in.x,e.in.y); ,結(jié)果:1,2,四、枚舉類型,1、概述 P291 所謂“枚舉”,是指將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內(nèi)。 枚舉類型也是用戶自定義的數(shù)據(jù)類型,用此種類型聲明的變量只能取指定的若干值之一。,2、定義枚舉類型,一般形式 enum cnred,yellow,blue,while,black; enum daysun,mon,tue,wed,thu,fri,sat; 0 , 1 , 2 , 3, 4, 5 (有值常量) 花括號中間的數(shù)據(jù)項稱“枚舉元素”或“枚舉常量”,是用戶定義的標識符。,3、枚舉型變量的聲明,enum cn a,b,c; enum day x,y,z; 亦可在定義類型時同時聲明枚舉型變量: enum cnred,yellow,blue,white,black a,b,c; 【注意】枚舉元素為有值
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年機加工多選題庫及答案
- (2025年)醫(yī)保改革新動向醫(yī)保知識考試題庫及答案詳解
- 2026年福建莆田第五中學(xué)初中部英語代課教師招聘若干名備考題庫及答案詳解1套
- 2025年練習題復(fù)習題選擇題試題試卷題庫期末考試試題(機試)9級《零售學(xué)》附答案
- 2025年水文知識面試題庫及答案
- 2025年高頻管理類面試題解析及答案
- (2025年)莎車縣檢察院書記員考試題(附答案)
- 2026廣東廣州醫(yī)科大學(xué)附屬第一醫(yī)院招聘249人備考題庫及答案詳解(奪冠系列)
- 2025年南陽社旗縣消防大隊招聘政府專職消防員13名備考題庫有答案詳解
- 2025年湖北專業(yè)技術(shù)職務(wù)水平能力測試(檔案)練習題及答案
- GB/T 2988-2023高鋁磚
- 東風7電路圖解析
- 數(shù)字填圖系統(tǒng)新版(RgMap2.0)操作手冊
- YY/T 1778.1-2021醫(yī)療應(yīng)用中呼吸氣體通路生物相容性評價第1部分:風險管理過程中的評價與試驗
- FZ/T 73009-2021山羊絨針織品
- JJF 1069-2012 法定計量檢定機構(gòu)考核規(guī)范(培訓(xùn)講稿)
- GB∕T 5900.2-2022 機床 主軸端部與卡盤連接尺寸 第2部分:凸輪鎖緊型
- 2011-2015廣汽豐田凱美瑞維修手冊wdl
- DFMEA編制作業(yè)指導(dǎo)書新版
- DB35∕T 1844-2019 高速公路邊坡工程監(jiān)測技術(shù)規(guī)程
- 城市管理綜合執(zhí)法局城管執(zhí)法與執(zhí)法程序PPT模板
評論
0/150
提交評論