![第六章結構體和共用體(正式)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/67297f5e-53e2-497e-9603-221bf74712e5/67297f5e-53e2-497e-9603-221bf74712e51.gif)
![第六章結構體和共用體(正式)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/67297f5e-53e2-497e-9603-221bf74712e5/67297f5e-53e2-497e-9603-221bf74712e52.gif)
![第六章結構體和共用體(正式)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/67297f5e-53e2-497e-9603-221bf74712e5/67297f5e-53e2-497e-9603-221bf74712e53.gif)
![第六章結構體和共用體(正式)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/67297f5e-53e2-497e-9603-221bf74712e5/67297f5e-53e2-497e-9603-221bf74712e54.gif)
![第六章結構體和共用體(正式)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/22/67297f5e-53e2-497e-9603-221bf74712e5/67297f5e-53e2-497e-9603-221bf74712e55.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1程序設計程序設計計算機學院計算機學院 第六章第六章2第第6 6章章 結構體與共用體結構體與共用體 6.1 6.1 結構體概述結構體概述6.1.1 6.1.1 結構體的引入結構體的引入 為了方便處理多個數(shù)據(jù)項的數(shù)據(jù),常常把這些關系密切但類型不同的數(shù)據(jù)項組織在一起,即“封裝”起來,并為其取一個名字,在C語言中,就稱其為結構體(有些高級語言稱之為記錄)。所以,結構體通常是由不同數(shù)據(jù)類型的數(shù)據(jù)項組成,一般也稱是由不同成員組成,因此可以說:一個結構體可包含若干成員,每一個成員可具有不同的名字及數(shù)據(jù)類型。 結構體的引入為處理復雜的數(shù)據(jù)結構提供了有力的手段,也為函數(shù)間傳遞一組不同數(shù)據(jù)類型的數(shù)據(jù)提供了方便,
2、特別是對于數(shù)據(jù)結構較為復雜的大型程序提供了方便。36.1.2 6.1.2 結構體類型的定義結構體類型的定義 結構體類型結構體類型和簡單類型不同,簡單類型是由系統(tǒng)預定和簡單類型不同,簡單類型是由系統(tǒng)預定義的,如義的,如intint、floatfloat、charchar,直接可以使用。而直接可以使用。而結構體類型結構體類型是根據(jù)需要由程序員自行定義,因此在使用之前必須先定義是根據(jù)需要由程序員自行定義,因此在使用之前必須先定義結構體類型。結構體類型。 結構體類型定義結構體類型定義struct 結構體名結構體名 類型標識符類型標識符 成員名;成員名; 類型標識符類型標識符 成員名;成員名; .;合法
3、標識符可省:無名結構體成員類型可以是基本型或構造型struct是關鍵字,不能省略4例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student s1;namenumsexagescoreaddr2字節(jié)2字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié).結構體類型定義描述結構的組織形式,定義類型時不分配內存,當定義變量時分配內存單元5說明說明(1)(1) 定義一個結構體類型只是描述了此結構體的組織形定義一個結構體類型只是描述了此結構體的組織形式,在編譯時并不為其分配存儲空間
4、,即僅描述此數(shù)據(jù)結式,在編譯時并不為其分配存儲空間,即僅描述此數(shù)據(jù)結構的形態(tài)或者說模型,故不能對定義的一個結構體類型進構的形態(tài)或者說模型,故不能對定義的一個結構體類型進行賦值、存取或運算。行賦值、存取或運算。(2)(2)結構體的成員可以是簡單變量、數(shù)組、指針、結構體結構體的成員可以是簡單變量、數(shù)組、指針、結構體或公用體等?;蚬皿w等。 (3)(3)結構體類型定義可以放在函數(shù)內部,也可以放在函數(shù)結構體類型定義可以放在函數(shù)內部,也可以放在函數(shù)外部。若放在內部,則只在函數(shù)內有效;若放在外部,則外部。若放在內部,則只在函數(shù)內有效;若放在外部,則從定義點到源文件尾之間的所有函數(shù)都有效。從定義點到源文件尾
5、之間的所有函數(shù)都有效。(4)(4)結構體成員的名字可以同程序中的其它變量同名,二結構體成員的名字可以同程序中的其它變量同名,二者不會相混,系統(tǒng)會自動識別它。者不會相混,系統(tǒng)會自動識別它。 66.2 6.2 結構體變量結構體變量6.2.1 6.2.1 結構體變量的定義與初始化結構體變量的定義與初始化1結構體變量的定義 同其它變量一樣,結構體變量也必須先定義,然后才能引用。一個結構體變量的定義可以有以下三種方式:(1) 先定義類型再定義變量 (推薦)(推薦)其形式:struct stud_typechar name10;long num;char sex;int age; float score
6、;char address10;struct stud_type student1, student2;7(2) (2) 在定義類型的同時定義變量在定義類型的同時定義變量(推薦)(推薦)其形式其形式: :struct stud_typestudent1, student2; (3) (3) 直接定義結構體變量直接定義結構體變量其形式其形式: :structstudent1,student2;8說明說明(1)(1) 在定義結構體類型時,系統(tǒng)并不分配內存空間,僅當在定義結構體類型時,系統(tǒng)并不分配內存空間,僅當定定義結構體變量時,系統(tǒng)才為被定義的每一變量分配相應的存義結構體變量時,系統(tǒng)才為被定義的每
7、一變量分配相應的存儲單元儲單元。如上面定義的結構體變量。如上面定義的結構體變量student1student1、student2student2在內在內存中各占存中各占3131個字節(jié)(個字節(jié)(10+4+1+2+4+10=3110+4+1+2+4+10=31)(2)(2) 結構體變量的定義一定要在結構體類型定義之后或同時結構體變量的定義一定要在結構體類型定義之后或同時進行,對尚未定義的結構體類型,不能用它來定義結構體變進行,對尚未定義的結構體類型,不能用它來定義結構體變量。量。例如:例如:對一個教師對一個教師teacherteacher的結構體類型未作定義,則下面的的結構體類型未作定義,則下面的
8、變量定義變量定義 structstruct teacher teacher teah1teah1 是錯誤的;反之亦然;是錯誤的;反之亦然;對某變量對某變量birthdaybirthday (也稱結構體成員變量),若其類型未作也稱結構體成員變量),若其類型未作定義,就寫定義,就寫structstruct date_type birthday; date_type birthday; 也是錯誤的。也是錯誤的。 92. 2. 結構體變量的初始化結構體變量的初始化 所謂所謂結構體變量初始化結構體變量初始化,就是在定義結構體變量的同時,就是在定義結構體變量的同時,對其成員變量賦初值,對其成員變量賦初值,
9、在賦值時應注意按順序及類型依次為在賦值時應注意按順序及類型依次為每個結構體成員指定初始值。每個結構體成員指定初始值。結構體初始化的一般結構體初始化的一般格式格式為:為:structstruct 結構體類型名結構體類型名 結構體變量結構體變量=初始化值初始化值 ;說明說明(1)(1)初始化數(shù)據(jù)之間用逗號分隔。初始化數(shù)據(jù)之間用逗號分隔。(2)(2) 初始化數(shù)據(jù)的個數(shù)一般與成員的個數(shù)相同,若小于成員初始化數(shù)據(jù)的個數(shù)一般與成員的個數(shù)相同,若小于成員數(shù),則剩余的成員將被自動初始化為數(shù),則剩余的成員將被自動初始化為0 0(若成員是指針,則(若成員是指針,則初始化為初始化為NULLNULL)。)。(3)(3
10、) 初始化數(shù)據(jù)的類型要與相應成員變量的類型一致。初始化數(shù)據(jù)的類型要與相應成員變量的類型一致。初始化時只能對整個結構體變量進行,不能對結構體類型中初始化時只能對整個結構體變量進行,不能對結構體類型中的某個成員進行初始化賦值。的某個成員進行初始化賦值。10例:例:struct date_type int year;int mouth;int day;;struct stud_typechar name10; long num; char sex; struct date_type birthday; float score; char address10; ; void main()struct
11、stud_type student1=wang,196103,m,1978,10,12,98,Xian;struct stud_type student2=liu,196105,m,1980,9,22,88,Benjing;116.2.2 6.2.2 結構體變量的引用結構體變量的引用1. 1. 對結構體變量成員的引用對結構體變量成員的引用 在在C C語言程序中,語言程序中,不準許對結構變量不準許對結構變量整體整體進行各種運算、賦值進行各種運算、賦值或輸入輸出操作,而只能是對其成員進行此類操作?;蜉斎胼敵霾僮?,而只能是對其成員進行此類操作。引用結構體變量成員的一般引用結構體變量成員的一般形式形式
12、: 結構體變量名結構體變量名. .成員名成員名其中其中 . . 是結構體成員運算符,其優(yōu)先級別最高,結合性是自左至是結構體成員運算符,其優(yōu)先級別最高,結合性是自左至右。由此對結構體成員就完全可以像操作簡單變量一樣操作它。右。由此對結構體成員就完全可以像操作簡單變量一樣操作它。如:如:對上例定義的結構體變量對上例定義的結構體變量student1student1或或student2student2,可作如下的賦可作如下的賦值操作:值操作:10= 10= wangwang;student1.num=196103;student1.num=19610
13、3;student1.sex=m;student1.sex=m;student1.birthday.year=1978;student1.birthday.year=1978;student1.birthday.mouth=10;student1.birthday.mouth=10;student1.birthday.day=12;student1.birthday.day=12;student1.score=98;student1.score=98;122. 2. 對結構體變量整體的引用對結構體變量整體的引用 結構體變量和簡單變量相比,除了上面所述在參加各種結構體變量和簡單變量相比,除了上面
14、所述在參加各種運算、賦值或輸入輸出方式上有所不同外運算、賦值或輸入輸出方式上有所不同外即是由結構體即是由結構體變量成員完成,其它同簡單變量一樣,如:變量成員完成,其它同簡單變量一樣,如:(1) (1) 可以相互賦值,但注意相互賦值的兩個結構體變量必須可以相互賦值,但注意相互賦值的兩個結構體變量必須是同一個結構體類型;是同一個結構體類型;如:如:student1=student2;student1=student2;(2) (2) 可作為函數(shù)的形參、實參或函數(shù)返回值,詳見下節(jié)。可作為函數(shù)的形參、實參或函數(shù)返回值,詳見下節(jié)。136.2.3 6.2.3 結構體變量作為函數(shù)參數(shù)結構體變量作為函數(shù)參數(shù)1
15、.1. 結構體變量成員作函數(shù)參數(shù)結構體變量成員作函數(shù)參數(shù)結構體變量中的所有成員都可作為函數(shù)參數(shù)結構體變量中的所有成員都可作為函數(shù)參數(shù)structstruct stud_type stud_type char name10;char name10;long num;long num;char sex;char sex;student1;student1;現(xiàn)將結構體變量現(xiàn)將結構體變量student1student1的三個成員分別傳遞給函數(shù)的三個成員分別傳遞給函數(shù)func1(),func2(),func3()func1(),func2(),func3():func1();f
16、unc1();func2(student1.num);func2(student1.num);func1(student1.sex);func1(student1.sex);14若需要將成員地址傳遞給函數(shù),則只需在其前加取地址符若需要將成員地址傳遞給函數(shù),則只需在其前加取地址符“&”“&”。如如:func1();func2(&student1.num);func1(&student1.sex);其中字符數(shù)組名其中字符數(shù)組名name代表其成員地址,故不許要寫代表其成員地址,故不許要寫“&”。2. 2. 結
17、構體變量整體作函數(shù)參數(shù)結構體變量整體作函數(shù)參數(shù)老板本的老板本的C C系統(tǒng)不允許用結構體變量作函數(shù)參數(shù),只允許用指向結系統(tǒng)不允許用結構體變量作函數(shù)參數(shù),只允許用指向結構體變量的指針作函數(shù)參數(shù)(第構體變量的指針作函數(shù)參數(shù)(第7 7章),傳遞的是結構體變量的首章),傳遞的是結構體變量的首地址。而地址。而ANSI CANSI C取消了這一限制,規(guī)定取消了這一限制,規(guī)定按值傳遞方式按值傳遞方式。在函數(shù)調用。在函數(shù)調用時,系統(tǒng)為形參結構體變量分配存儲空間,并從相應的實參結構體時,系統(tǒng)為形參結構體變量分配存儲空間,并從相應的實參結構體變量中取得各成員的值,若對形參中結構體變量各成員值進行修改,變量中取得各成
18、員的值,若對形參中結構體變量各成員值進行修改,并不能修改實參結構體變量各成員的值。這里要注意,實參和形參并不能修改實參結構體變量各成員的值。這里要注意,實參和形參結構體變量類型應當完全一致。結構體變量類型應當完全一致。156.3 6.3 結構體數(shù)組結構體數(shù)組6.3.1 6.3.1 結構體數(shù)組的定義與初始化結構體數(shù)組的定義與初始化1. 1. 結構體數(shù)組的定義結構體數(shù)組的定義 在定義結構體數(shù)組時其定義方法與定義結構體變量方法類似,在定義結構體數(shù)組時其定義方法與定義結構體變量方法類似,也有三種形式。也有三種形式。定義如下:定義如下:struct date_type int year; int mou
19、th; int day;;struct stud_type char name10;long num;char sex;struct date_type birthday;float score;char address10;struct stud_type student3; 16由此就定義了一個結構體數(shù)組由此就定義了一個結構體數(shù)組student3student3,它有它有3 3個個元素,每個元素都是元素,每個元素都是structstruct stud_type stud_type類型,各占類型,各占3535個字節(jié)(個字節(jié)(10+4+1+(2+2+2)+4+10=3510+4+1+(2+2+
20、2)+4+10=35)。)。 172. 2. 結構體數(shù)組的初始化結構體數(shù)組的初始化 結構體數(shù)組在定義的同時可以初始化。其一般格式結構體數(shù)組在定義的同時可以初始化。其一般格式是在定義之后緊跟一個用花括號括起來的一組初始數(shù)據(jù),是在定義之后緊跟一個用花括號括起來的一組初始數(shù)據(jù),為了增強可讀性,最好使每一個數(shù)組元素的初始數(shù)據(jù)也為了增強可讀性,最好使每一個數(shù)組元素的初始數(shù)據(jù)也用花括弧括起來,以此來區(qū)分各個數(shù)組元素。用花括弧括起來,以此來區(qū)分各個數(shù)組元素。對上所定義的結構體數(shù)組對上所定義的結構體數(shù)組studentstudent初始化如下:初始化如下:stuct stud_type student2= wa
21、ng,196103, m,1978,10,12,98, xian, zhang,196102, f,1977,1,10,87, Beijing;18說明說明(1)(1) 可以將一個結構體數(shù)組元素賦值給同一結構體類型數(shù)組中另可以將一個結構體數(shù)組元素賦值給同一結構體類型數(shù)組中另一個元素,或賦給同一類型的變量。一個元素,或賦給同一類型的變量。如如:structstruct stud_type student3, student1 stud_type student3, student1;現(xiàn)在就定義了一個結構體數(shù)組現(xiàn)在就定義了一個結構體數(shù)組studentstudent,又定義了一個結構體變又定義了一個
22、結構體變量量student1student1,則下面的賦值合法。則下面的賦值合法。studentlstudentlstudent0student0;student0=student1;student0=student1;studnet1=student1;studnet1=student1;(2)(2) 不能把結構體數(shù)組元素作為一個整體直接進行輸入或輸出。不能把結構體數(shù)組元素作為一個整體直接進行輸入或輸出。如如 printfprintf (%d,student0) (%d,student0);或或scanf(%d,&student0)scanf(%d,&student0);只能
23、以單個成員為對象進行輸入輸出,只能以單個成員為對象進行輸入輸出,如:如:scanf(%sscanf(%s, ), );scanf(%ldscanf(%ld,student0.num)student0.num);printfprintf (%s%ldn, , student0.num) (%s%ldn, , student0.num);19例 統(tǒng)計后選人選票struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,
24、0; void main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展開:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例例 用宏定義和函數(shù)實現(xiàn)同樣的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品攝影拍攝合同范本
- 健身房私教合同范本
- 2025年度新型綠色建筑租賃合同范本
- 出兌房屋合同范例
- ppp合同范例實例
- 保管勞動合同范例
- 2025年度城市綜合體規(guī)劃設計咨詢合同
- 廣東省x景區(qū)旅游開發(fā)項目可行性研究報告
- 2025年中國新風量檢測儀行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 買債權居間合同范本
- 對使用林地的監(jiān)管事中事后監(jiān)督管理
- 體質健康概論
- 檔案管理流程優(yōu)化與效率提升
- 2023高考語文實用類文本閱讀-新聞、通訊、訪談(含答案)
- 人工智能在商場應用
- (完整word版)大格子作文紙模板(帶字數(shù)統(tǒng)計)
- 高考語文復習:小說閱讀主觀題題型探究-解讀《理水》
- revit簡單小別墅教程
- 第二章 第一節(jié) CT設備基本運行條件
- 藍印花布鑒賞課件
- 血液灌流流程及注意事項詳細圖解
評論
0/150
提交評論