第9章結構和聯合_第1頁
第9章結構和聯合_第2頁
第9章結構和聯合_第3頁
第9章結構和聯合_第4頁
第9章結構和聯合_第5頁
已閱讀5頁,還剩30頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第9章 結構和聯合 本章要點nC語言的結構類型。n結構數組。n指向結構的指針。nC語言的動態數據結構。n聯合類型。本章難點n結構指針和C語言的動態數據結構。 9.1 結構的說明和引用9.2 結構的指針9.3 結構和函數9.4 結構數組9.5 聯合(共用體)9.6 用typedef定義類型名 9.1 結構的說明和引用 n在實際中常常描述同一對象的不同屬性,如一個學生有學號、姓名、性別、年齡、各科分數,表示這些屬性的數據具有不同的類型,因而不能用數組表示。C語言提供了一種數據結構,可以把這些不同類型的數據組成一個整體,這就是結構類型。 n結構類型是各種結構的總稱,是一種構造類型。一個結構變量可以由

2、不同類型的成員變量組成,這些成員變量又稱為結構的域、分量。結構的所有成員除自身的名字外,還擁有共同的名字,即結構變量名。9.1.1 結構說明9.1.2 結構的引用 9.1.1 結構說明 struct 結構體名 數據類型1 成員名1; 數據類型2 成員名2; 數據類型n 成員名n; ;結構體類型定義的一般形式: lstructstruct為關鍵字;為關鍵字;l結構體名結構體名是用戶定義是用戶定義的的類型標識類型標識。l 中是組成該結構體中是組成該結構體的的成員成員。成員的。成員的數據數據類型類型可以是可以是C語言所允語言所允許的任何數據類型許的任何數據類型。n在定義結構體類型的同時定義變量例如:

3、 struct student char num8,name20,sex; int age; float score; st30; struct 結構體名 成員定義表; 變量名表;n直接定義結構體類型變量 例如: struct char num8,name20,sex; int age; float score; st30, a, b, c; struct 成員定義表; 變量名表;n在結構的說明中,結構成員可以為任何類型且結構成員還可以和結構外部的其它變量同名,不同結構的成員也可以同名,但同一結構的成員不能同名。 n例如學生類型的定義:例如學生類型的定義:struct student char

4、 num8; /* 學號是字符數組類型學號是字符數組類型 */ char name30; /* 姓名是字符數組類型姓名是字符數組類型 */ char sex; /* 性別是字符型性別是字符型 */ int age; /* 年齡是整型年齡是整型 */ char addr60; /* 住址是字符數組類型住址是字符數組類型 */ int score6; /* 成績是整型數組類型成績是整型數組類型 */ ;n利用已定義的結構體類型名定義變量 struct 結構體名 變量名表;例如: struct student s30, t1, t2; 按照結構體類型的組成,系統為定義的結構體按照結構體類型的組成,系

5、統為定義的結構體變量分配內存單元。結構體變量的各個成員在內存變量分配內存單元。結構體變量的各個成員在內存中占用連續存儲區域,中占用連續存儲區域,結構體變量結構體變量所占內存所占內存結構體中結構體中每個成員每個成員所占用內存的所占用內存的長度之和長度之和。struct studentnum8個字節name30個字節sex1個字節age4個字節addr60個字節score24個字節9.1.2 結構的引用 1結構的初始化 結構變量在說明時可以初始化,初值是由常量表達式組成的初值表。例如,struct student char name10; short sex; int age; float sco

6、re; student1“zhangsan”,1,20,88.8; 2結構變量的引用 對結構變量的引用只允許下列5種情況:(1)同類型的結構變量相互賦值。例如 student2=student1;(2)函數返回的結構成員給同類型的結構變量。(3)對結構變量取地址。例如&student1是結構student1的地址,與第一個成員的地址值相同。(4)結構變量作為函數的參數和函數的返回值。(5)用于引用結構的成員。 3結構成員的引用 結構成員的引用通過“”運算符構成的表達式。 結構變量名成員名結構變量名成員名其中“” 稱為結構成員運算符。連接結構變量名和成員名,屬于最高級運算符。例如stud

7、ent.sex=1;student.sex=0;scanf(“%s”,);但=”zhang san”; 則為非法。 4嵌套的結構 結構的一個成員可以是一個結構,含有結構成員的結構稱為嵌套的結構。 struct date int year,month,day; ; struct student char num8; char name30; char sex; birthday; /* 成員為結構體類型成員為結構體類型 */ char addr60; int score6; ;num8個字節name30個字節sex1個字節birthdayyea

8、r4個字節month4個字節day4個字節addr60個字節score24個字節例:輸入三個人的信息,求其總成績。n#include nvoid main()nstruct studn char name20;n int age;n char sfzh20;n float zcj;na,b,c;n float zcj;n printf(請輸入第一個人的信息:name,age,sfzh,zcj:n);nscanf(%s %d %s %f,,&a.age,a.sfzh,&a.zcj);nprintf(請輸入第二個人的信息:name,age,sfzh,zcj:n);nsc

9、anf(%s %d %s %f,,&b.age,b.sfzh,&b.zcj);nprintf(請輸入第三個人的信息:name,age,sfzh,zcj:n);nscanf(%s %d %s %f,,&c.age,c.sfzh,&c.zcj);nprintf(第一個人的信息是:);nprintf(%s %d %s %f,,a.age,a.sfzh,a.zcj);n zcj=a.zcj+b.zcj+c.zcj;nprintf(總成績:%fn,zcj);n9.2 結構的指針 n 指向結構的指針(或稱結構指針)可以用來引用結構的成員,

10、可以作為參數傳給函數,也可以作為函數的返回值。 1結構指針的說明 指向結構的指針使用之前也要進行說明,例如 struct date int year, month, day;d, *p=&d;n用結構體變量名的引用形式: d.year d.month d.dayn 用結構體指針變量的引用形式: (*p).year (*p).month (*p).day p-year p-month p-day 注意:成員引用表達式中的( )不能省,如(*pd).day不能寫成*pd.day,因為“.”運算符的優先級高于*,所以*pd.day等同于*(pd.day),在該例中為非法操作。 結構成員運算符

11、“-”和“.”的優先級相同,它們與()、 屬于同一優先級,按從左到右結合。9.3 結構和函數 1結構作函數的參數結構作函數的參數有三種可能的方法。(1)傳一個結構成員(用結構成員作實參);(2)傳整個結構(用結構變量名作實參);(3)傳結構的指針(用結構的地址或指向結構的指針作實參)。我們推薦使用第三種方法。 函數的返回值為結構變量或指向結構變量的指針。 已定義在comp.h中。struct complex float re; /*實部*/float im; /*虛部*/ ;【例】寫一個函數計算兩個復數的和。#include comp.hstruct complex *addcomp(stru

12、ct complex c1, struct complex c2)static struct complex temp;temp.re=c1.re+c2.re;temp.im=c1.im+c2.im;return(&temp);9.4 結構數組9.4.1 結構數組的說明,引用和初始化9.4.2 結構數組作函數參數9.4.3 sizeof運算符9.4.4 用結構的指針引用結構數組的成員9.4.1 結構數組的說明、引用和初始化 結構數組是其元素都是具有相同結構體類型的結構體變量。定義的一般格式為: struct 結構體名 結構體數組名元素個數,結構體數組名元素個數,; 其中,“struct

13、 結構體名”是已定義過的結構體類型。因此定義結構體數組和定義結構體變量的方法相仿,只需說明其為數組即可。例如:struct student int num; char name10; char sex; int age; float score; char addr30;struct student stu3; 以上定義了一個數組stu,其元素為struct student類型數據,數組有3個元素。2、結構體數組的初始化 一個外部的或靜態的結構體數組在定義的同時可以初始化。其一般格式是在定義之后緊跟一個用花括號括起來的一組初始化數據: struct 結構體名 結構體數組名=初始數據表列; 其中

14、,“struct 結構體名”是已定義過的結構體類型。 【例】對候選人得票的統計程序。設有三個侯選人,每次輸入一個得票的候選人的名字,要求最后輸出各人得票結果。 #include #include “string.h”struct personchar name18; int count;leader3=Li,0,Zhang,0,Wang,0;void main () int i,j; char leader_name18; for(i=1;i=10;i+) scanf (%s,leader_name);for (j=0;j3;j+)if(strcmp(leader_name,leaderj.n

15、ame)=0) leaderj.count+; printf (n); for (i=0;i3;i+)printf(%5s,%dn,,leaderi.count);9.4.2 結構數組作函數參數 n類似于整型數組9.4.3 sizeof運算符 nsizeof是一個單目運算符,用于計算一個對象的大小,它是在編譯時執行的運算,所以sizeof表達式是一個常量表達式,sizeof表達式有兩種形式: sizeof表達式或 sizeof(表達式) sizeof(類型名)【例】利用結構體指針輸出一組化學元素名稱及其原子量。 struct list int i; char name4

16、; float w; tab4=1,H,1.008,2,He,4.0026, 3,Li,6.941,4,Be,9.01218;tab數組1Htab01.0082Hetab14.00263Litab26.9414Betab39.012189.4.4 用結構的指針引用結構數組的成員main( ) struct list *p; printf(NotNametAtomic Weightn); for (p=tab; pi, p-name, p-w); tab數組1Htab01.0082Hetab14.00263Litab26.9414Betab39.01218ppppp1 H 1.0082 He 4

17、.00263 Li 6.9414 Be 9.012189.5 聯合(共用體) n在實際處理中為了方便處理,有時需要在不同的時刻將不同類型的值存放在同一變量中,而在任一時刻,該變量僅含特定類型的值,這種變量就是聯合類型的變量(簡稱聯合或聯合類型變量)。n聯合的定義方式就是將struct用union代替,其它形式同結構相同。如:假定一個常量可能是int、double或字符串,為了用同一個存儲區域來存放,可以說明如下的聯合union unode int ival; double dval; char str100; u; 分配存儲單元時,編譯程序按聯合的成員中最長的那一個類型為聯合變量分配最長的那一個類型為聯合變量分配存儲空間存儲空間。 n 聯合變量有地址,可以用&運算符對聯合取地址,可以說明指向聯合的指針。聯合成員的引用和結構成員的引用形式相同,一般為下列三種形式之一 聯合變量名.成員名 指向聯合的指針-成員名 (*指向聯合的指針).成員名 注意:聯合成員彼此不是并存的,任一時刻聯合聯合成員彼此不是并存的,任一時刻聯

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論