c語言第10章結構體和共同體精_第1頁
c語言第10章結構體和共同體精_第2頁
c語言第10章結構體和共同體精_第3頁
c語言第10章結構體和共同體精_第4頁
c語言第10章結構體和共同體精_第5頁
免費預覽已結束,剩余20頁可下載查看

下載本文檔

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

文檔簡介

1、“-§10.1 結構體類型的定義結構體由若干成員組成,各成員可有不同的類型。 在程序中要使用結構體類型,必須先對結構體的組 成進行描述。例如,學生信息可用結構體描述為:struct studentint num ;/*學號水/char name(20;/*姓名*/ char sex; /* 性別*/ int age;/*年齡*/fl oat score; /* 成績*/char addr40);嚴家庭住址水/其川,關鍵字struct引入結構體類型的定義。struct后 任選的標識符是結構體類型的名字。用花括號括起來的 是結構體成員說明。上例說明結構體類型stnict student有

2、6個成員,分別命 名為num、name、sex、age、score和addi*。這6個成員分 別表示學生的學號、姓名、性別、年齡、成績和家庭住 址,顯然它們的類型是不同的。需要特別指出的是"struct studenf是程序設計者自 己定義的類型,它L系統預定義的標準類型(如int、char 等)一樣,可以用來定義變量,使變量具Wstruct student 類型。例如:Struct student stl,st220;分別定義了struct student結構體類型的變量st 111 struct student結構體類型的數組變量st2。結構體類型的定義形式為:struct結構體

3、類型名成員說明表列其屮,花扌舌號內的內容是該結構體類型的成員說 明,每個成員說明的形式為:類型名成員名;實際上,凡是相關的若干數據對象都可組合成一個結 構體,在一個結構體名下進行管理。例如,由日、月、 年組成的結構休類型為:Struct date int day;int month;int year;又如,某職工信息結構體類型為:struct personchar name20;char address40;姓名*/*地址*/float salary;float cost;struct date hiredate;/*工資*/*扣款*/*聘任日期*/¥中,結構體類型struct pe

4、rson含有一個結構體類型 成員 hiredale。該例子說明結構體類型可以嵌套定義,即一個結構 體類型屮的某些成員又是其他結構體類型。但是這 種嵌套不能包含口身,即不能曲自己定義自己。結構體類型說明中,詳細列出了一個結構體的組成 情況、結構體的各成員名及其類型。結構體類型說 明了一個數據結構的“模式”,但不定義“實物”, 并不要求分配實際的存儲空間。程序要實際使用結構體,必須定義結構體變量。編 譯程序在為結構體變量分配存儲空間時,其中各成 員的存儲格式及其意義與結構體類型保持一致。§10.2結構體類型變量10.2.1結構體類型變量的定義要定義一個結構體類型的變量,可采取以下3 種方

5、法。1先定義結構體類型,再定義變量女II上面LL定義了一個結構體類型struct student, 可以用它來定義變量。例如:struct student student 1,student?;定義 student 1 和 student?為 struct student 類型變 量,即它們具有struct student類型的結構體變O應當注意,將一個變量定義為標準類型(基 本數據類型)與定義為結構體類型不同之處在于: 后者不僅要求指定變量為結構體類型,而且要 求指定為某一特定的結構體類型。例如,對 struct student,不能只指定為sbuct型而不指定 結構休名。而在定義變量為整型

6、時,只需指定 為int型即可。2.在定義類型的同時定義變董:例如:Struct student int num;char name20;char sex;int age;float scorechar addr|40; student 1 ,student2;它的作用與前面定義的和同。即定義了 兩個struct student類型的變量student 1和 student!o這種定義方法的一般形式為:struct結構體類型名成員說明表列變量名表列;3.直接定義結構體類型變量其一般形式為:struct成員說明表列變量名表列;即在結構體定義時不出現結構體類 型名,這種形式雖然簡單,但不能 在再需要

7、時,使用所定義的結構體 類型。關于結構體類型,有幾點需要說明:(1)類型與變量是不同的概念,不要混同。 對結構體變量來說,在定義時一般先定義 一個結構體類型,然后定義變量為該類型。 只能對變量賦值、存取或運算,而不能對 一個類型賦值、存取或運算。在編譯時, 對類型是不分配存儲空間的,只對變量分 配存儲空間。(2)対結構體中的成員,可以單獨使用, 它的作用與地位相當于普通變量。(3)成員也可以是一個結構體變量。例如:Struct dateint month; int day; int year;struct memberint num;char namc20; char sex;int age;

8、/*成員變屋是一個結構體變量勺struct date birthday; char addrf40;1 stul,stu2;先定義一個struct date結構體類型,它包扌舌3 個成員:month、day、year,分別代表月、0、 年。然后在定義struct member結構體類型時,成 員birthday的類型定義為struct date類型已定義 的類型struct date與其彳也類型(如int、char)一樣可 以用來定義成員的類型。(4)成員名可以與程序中的其他變量名 相同,兩者不代表同一對象。例如,程 序中可以另定義一個變量num,它與 struct member中 的num是

9、兩回事,互不干 擾。10.2.2結構體變量的使用引用一個結構體變量有兩種方式=通過 結構體變量名和通過指向結構體的指針變量。 與之對應的,引用結構體成員的標記形式也 有兩種,分別用運算符”和“一”來 標記。(1)由結構體變量名引用其成員的標記形 式為:結構體變量名成員名例女11, Stu 1.num表示引用結構體變量Stu 1 屮的num成員,因該成員的類型為int型 的,所以可以對它施行任何int型變量可 以施行的運算。例如:Stu 1 .num = 20312;(2)出指向結構體的指針變量引用結構體成員的標記形 式為:指針變量名-> 成員名例如,如下變量定義:struct nodef

10、loat x,y;p,u,*pt;是義T兩個結構體變量p、u和一個指向該結構休的指 針變量pt,分析以下語句:P x=12.2;p.y=24.3;pt=&u;p t->x = 23.7;pt->y=3.5;語句“卩1 = &11廣使戸1指向結構體變量11,可用 pt-乂和卩1->丫訪問結構體變量11的兩個成員。上述語句執行悄況町用圖10.1描述各變量之間 的關系。pptu圖10.1通過指向結構體的指針引川結構體上述例子說明結構體的成員可以像普通變量一樣使用。根據其類型決定其所有合法的運算。如果結構體成員本身又是結構體類型的,則 町繼續使用成員運算符取結構體成員

11、的結構體 成員,逐級向下,引用最低一級的成員C程序 能對最低一級的成員進行賦值或存取;例如,對 Stu 1某些成員的訪問:Stu 1 .birthday.day=23;Stu 1 .birthday.month=8;stul .birthday.year=2003;程序也能對結構體的最低一級的成員進行其他運 算,包括取地址運算,引用成員的地址。例如:scanfC%'&stu Lage);在早期的C語言中,程序只能對結構體變量(包括 結構體變量的結構體成員)取地址運算,不允許 對結構體進行賦值運算。ANSI CU經取消了這 個限制,允許結構休值賦給相同類型的結構休變O10.2.3

12、結構體變量的初始化結構體變量和其他變量一樣,可以在定義變量 的同時進行初始化。1.對外部存儲類型的結構體變量進行初始化例101分析下列程序的輸出結果。#include <stdio.h> struct student long num;char name20J;char sex;char addr40J;a=3O21IO3/Uiang Linpad'TM','T23 Shaoshan Road"main()printfV'No:%ldnName:%snSex:%cnAddress:%sna.num, ,a.sex,a.acldr

13、);程序運行結來如下:No:3021103NameJiang LinpanSex;MAddress: 123 Shaoshan Road2.在函數內部的結構體變量進行初始化上面例子的定義部分可以放到main函數中。程 序如下:main() static struct studentlong hum;char name20;char sex;char addr40;a=3O21IO3, Tiang Linp723 Shaoshan RoadJ;p rintft''No:%ldnName:%snSex:%cnAddress:%sna.num,a,n ame,a.sex,a.addr

14、);程序運行結果與上面例子程序和同。注意,對自動結構體變量不能在定義時賦初值, 只能在函數執行時用賦值語句對各成員分別賦 值。1024結構體變量的輸入和輸出C語言不能把一個結構體變量作為一個整體進行輸 入或輸出,應該按成員變量輸入輸出O例如,若有一 個結構休變量:structchar nameI2;char addr18;long num;stud= ''Wang Dawei", I25 Beijing Road'3021118;變量stud在內存中存儲情況如圖10.2所示。是按 成員變量存放的。W a n|gDawe i kORoad© 302II

15、I8addr18namel2圖102結構體變量在內存中的存儲帖況為兩個字符串數據和一個K整型數據號因此輸出stud 變垃應該使用如下方式:P nnttV'%s,%s,% 1 dn',stud.addr,stud,num);輸入said變量的各成員值,則用:scanf('%s%s%ld',stud.addG&studnum); 由于成員項name和addi是字符數組,按 s字符申格式 輸入,故不要寫成&和&stud.addr,而num成員 是long型,故應當用&stud.num

16、o當然也可以用gets函數和puts函數輸入和輸出一個結 構體變量小的了符數組成員。例如:gets();puts();gets函數輸入一個字符串給,puts函數輸出 S數組中的字符串。§10. 3結構體典型數組一個結構體變量屮可以存放一紐數據(如一個學生的學 號、姓名、成績等數據)。如果冇10個學生的數據需耍 參加運算和處理,顯然應該用數組,這就是結構體數組。 結構體數組與以前介紹過的數值型數組不同之處在于 每個數組元素都是一個結構體類熨的數據,它們都分別 包括各個成員項。10.3.1結構體類型數組的定義與定義結構

17、體變量的方法一樣,在結構體變量名z后指定元素個數,就 能定義結構體數組。例如:struct student students30;struct person employees 100;structchar name20;int num;float Price; float quantity; )parts200;以上定義了一個數組students,它有30個元素,每個元 素的類型為struct student的結構體類型。定義數組 employees,有100個元素,毎個元素是struct person結構 體類型。定義數組parts,'200個元素,每個元素也是一 個結構體類型。它

18、們都是結構體數組,分別川于表示 個班級的學生、一個部門的職工、一個倉庫的產品。如同元素為標準數據類型的數組一樣,結構體數組各 元素在內存屮也按順序存放,也可初始化,對結構體 數組元素的訪問也要利用元索的下標。特別地,訪問 結構體數組元素的成員的標記方法為:結構體數組名I元素下標h結構體成員名例如,訪問part S數組元素的成員:partstlOJ- price=375;scanfp%s': );10.3.2結構體類型數組的初始化在對結構體數組初始化時,要將每個元素的數據分別用花抵勺括起*。 例如:struct student char name(20;long n

19、um; int age; char sex;float score;)students(5;( ( ZhuDongfen302I IOI,l8?M93b 'Zhang FaGhong',3021102,19,'M',90.5, ”Wang Peng'3021 IO3,I6/M85), ”Zhan Hong",3021104,16, 'F',95, "Li Linggou3021105,20/F671);這樣,在編譯時將一個花插號中的數拯賦給一個元素, 即將第一個花括弧屮的數據送給sludentsrO,第二個花扌舌弧 內

20、的數據送給studentsriL.o如果賦初值的數據組的個數 與所定義的數組元素相等,則數組元素個數可以省略不寫。 這和前面有關章節介紹的數組初始化相類似。此時系統 會根據初始化時提供的數據組的個數自動確定數組的人 小。如果提供的初始化數據組的個數少于數組元素的個 數,則方扌舌弧內的元素個數不能省略,例如:struct studentsuidems3:.;只對前3個元素賦初值,其他元素未賦初值,系統將對數 值型成員賦以零,對字符型數據賦以“空”串即“ 0"。1033結構體數組的使用一個結構體數組的元素相當于一個結構體變量。引用結構 體數組元素有如下規則:(1)引用某一元素的一個成員。

21、例如:sludentsi.num這是序號為i的數組元素'PfKjnum成員。如杲數組已如上初 始化,且i=2,則相當 J-students2J.num,其值為3021103。(2)町以將一個結構體數組元素賦給同一結構體類型數組 中的另一個元素,或賦給同一類型的變暈。例如;struct student students3,studentl;現在定義了一個結構體數紐students,它冇3個元素,又定義 了一個結構體變量student 1,!40下面的賦值合法。student I =students OJ; students2=students 1 J; studentsl =studentl,(3)不能把結構體數組元素作為一個整體直接進行輸 入或輸出,只能以單個成員對彖進行輸入輸出。例如:scanfV9%s",studcnts01 name);p rinlfP('%ld&studcrits|Onum);> ;pa§10. 4結構體與函數10.4.

溫馨提示

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

評論

0/150

提交評論