C語言_1結構體聯(lián)合體_第1頁
C語言_1結構體聯(lián)合體_第2頁
C語言_1結構體聯(lián)合體_第3頁
C語言_1結構體聯(lián)合體_第4頁
C語言_1結構體聯(lián)合體_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第7章 結構體、鏈表與文件系統(tǒng)1結構體聯(lián)合體枚舉類型1C數(shù)據(jù)類型基本類型構造類型指針類型空類型void定義類型typedef數(shù)值類型字符類型char枚舉類型enum整 型浮點型單精度型float雙精度型double短整型short長整型long整型int數(shù)組結構體struct聯(lián)合體union系統(tǒng)給定的數(shù)據(jù)類型在根本類型根底上自己定義的記錄某班30名學生的學號、姓名、性別、年齡、成績int ids30; char names3020; char sexes30; int ages30; float scores30概念引入:解決問題:記錄某班所有學生的成績 3 名? 30 名?float x,y

2、,z;float scores30;結構體的定義及應用思考在程序里表示一個人姓名、性別、年齡,怎么表示?想表示多少個人呢?如何用計算機程序實現(xiàn)下述表格的管理? 表7-1 某學校學生成績管理表學號姓名性別入學時間計算機原理英 語數(shù) 學音 樂1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女1999789587905 6 數(shù)組的解決方法int studentId30; /* 最多可以管理30個學生, 每個學生的學號用數(shù)組的下標表示*/charstudentName3010;charstudentSex302;int timeOfEnte

3、r30; /*入學時間用int表示*/int scoreComputer30;/*計算機原理課的成績*/int scoreEnglish30; /*英語課的成績*/int scoreMath30; /*數(shù)學課的成績*/int scoreMusic30; /*音樂課的成績*/數(shù)據(jù)的內存管理方式 907889788392729572889887827866901234令狐沖林平之岳靈珊任瑩瑩男男女女1999199919991999數(shù)組的解決方法數(shù)組可處理大量的同類型數(shù)據(jù),數(shù)組中的每一個元素都屬于同一種數(shù)據(jù)類型數(shù)據(jù)的內存管理方式 90788978839272957288988782786690123

4、4令狐沖林平之岳靈珊任瑩瑩男男女女1999199919991999數(shù)組的解決方法分配內存不集中,尋址效率不高 對數(shù)組進行賦初值時,容易發(fā)生錯位 結構顯得比較零散,不容易管理希望的內存分配圖 1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任瑩瑩女199978958790結構體的解決方法struct STUDENT int studentID; /*每個學生的序號*/ char studentName10;/*每個學生的姓名*/ char studentSex4; /*每個學生的性別*/ inttimeOfEnter; /*每個學生的入學時

5、間*/ intscoreComputer; /*每個學生的計算機原理成績*/ intscoreEnglish; /*每個學生的英語成績*/ intscoreMath; /*每個學生的數(shù)學成績*/ intscoreMusic; /*每個學生的音樂成績*/ ;struct STUDENT是一個類型struct STUDENT students4;students0.studentIDstudents0.scoreComputer它們都是變量,一般稱為結構的成員變量結構體結構體是一種構造數(shù)據(jù)類型用途:把不同類型的數(shù)據(jù)組合成一個整體-自定義數(shù)據(jù)類型結構體類型定義struct 結構體名 類型標識符 成員

6、名; 類型標識符 成員名; .;成員類型可以是根本型或構造型struct是關鍵字,不能省略合法標識符可省:無名結構體分號不能省略例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 結構體變量的定義1、先定義結構體類型,再定義結構體變量一般形式: struct 結構體名 類型標識符 成員名; 類型標識符 成員名; .;struct 結構體名 變量名表列;定義結構體變量之后為其分配內存單元namenumsexagescoread

7、dr4字節(jié)4字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié).stu1結構體的內存占用int 占用內存字節(jié)數(shù) = 4struct 類型用內存字節(jié)數(shù) = ?是所有成員變量的內存總和嗎?struct numbershort i; /2 char ch; /1 float f; /4 ;printf(%dn, sizeof(struct number);用運算符sizeof獲得結構體大小sizeof(變量或表達式)sizeof(類型)8Why?結構體的內存占用事實上所有數(shù)據(jù)類型在內存中都是從偶數(shù)地址開始存放的且結構所占的實際空間一般是按照機器字長對齊的特定數(shù)據(jù)類型的數(shù)據(jù)項的大小是與機器相關的,如32位系統(tǒng):結構體類

8、型大小=(成員數(shù)據(jù)類型大小的和+3)/4*47+3/4*4=8ifchichf非所有成員變量的內存總和8個字節(jié)2、定義結構體類型的同時定義結構體變量一般形式:struct 結構體名 類型標識符 成員名; 類型標識符 成員名; .變量名表列;例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 3、直接定義結構體變量一般形式:struct 類型標識符 成員名; 類型標識符 成員名; .變量名表列;例 struct int num; char name20; ch

9、ar sex; int age; float score; char addr30; stu1,stu2; 用無名結構體直接定義變量只能一次結構體類型與結構體變量概念不同類型:不分配內存; 變量:分配內存結構體類型是一個模型,類似系統(tǒng)給定的根本類型比方int、 float 等類型,只是結構體類型是用戶自定義的而已。結構體可嵌套結構體成員名與程序中變量名可相同,不會混淆例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;numnam

10、ebirthdaymonthdayyear結構體變量的引用引用規(guī)那么 結構體變量不能整體引用,只能引用變量成員可以將一個結構體變量賦值給另一個結構體變量結構體嵌套時逐級引用成員(分量)運算符優(yōu)先級: 1結合性:從左向右引用方式: 結構體變量名.成員名例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score; stu1.age+;例 struct student i

11、nt num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); ()stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ()例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( )例 struct student int num; char name2

12、0; struct date int month; int day; int year; birthday; stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;結構體變量的初始化形式一:struct 結構體名 類型標識符 成員名; 類型標識符 成員名; .;struct 結構體名 結構體變量=初始數(shù)據(jù);例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin,M,19,

13、“200 Beijing Road;形式二:struct 結構體名 類型標識符 成員名; 類型標識符 成員名; .結構體變量=初始數(shù)據(jù);例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin,M,19, “200 Beijing Road; 形式三:struct 類型標識符 成員名; 類型標識符 成員名; .結構體變量=初始數(shù)據(jù);例 struct int num; char name20; char sex; int age; char addr30; stu1=112,

14、“Wang Lin,M,19, “200 Beijing Road; 定義自己的類型名 struct student student1,student2;/*可以*/ student student1,student2;/*不可以*/typedef struct student STUD ; STUD student1,student2; /*可以!*/typedef為一種已存在的類型定義一個新名字STUD與struct student類型是同義詞struct student int num; char name20; char sex; int age; float score; char

15、addr30;結構體數(shù)組結構體數(shù)組的定義struct student int num; char name20; char sex; int age; ;struct student stu30;numnamesexagenumnamesexagestu0stu132B結構體數(shù)組初始化例 struct int num; char name20; char sex; int age; stu =,;順序初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Lin,M,

16、20, 101,“Li Gang,M,19, 110,“Liu Yan,F,19; 例 struct student int num; char name20; char sex; int age; stu =,;分行初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Lin”,M,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化時維數(shù)可省結構體數(shù)組引用引用方式: 結構體數(shù)組名下標.成員名 struct stude

17、nt int num; char name20; char sex; int age; str3;stu1.age+;strcpy(, “ZhaoDa”);=“ZhaoDa 結構體和指針指向結構體變量的指針定義形式:struct 結構體名 *結構體指針名;例 struct student *p;使用結構體指針變量引用成員形式存放結構體變量在內存的起始地址numnamesexagestupstruct student int num; char name20; char sex; int age; stu;struct student *p=&stu;(*結構

18、體指針名).成員名結構體指針名-成員名結構體變量名.成員名指向運算符優(yōu)先級: 1結合方向:從左向右#includemain() struct student long int num; char name20; char sex; float score; stu_1,*p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,Li Lin); p-sex=M; p-score=89.5; printf(nNo:%ldnname:%snsex:%cnscore:%fn, (*p).num,p-name,stu_1.sex,p-score);例 int n;

19、 int *p=&n; *p=10; n=10struct student stu1;struct student *p=&stu1;stu1.num=101; (*p).num=101運行結果:No:89101name: Li Lin sex:Mscore:89.5指向結構體數(shù)組的指針struct student int num; char name20; char sex; int age;stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu

20、;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1stu3相當于p = &stu0;構造數(shù)據(jù)類型,也叫共用體用途:使幾個不同類型的變量共占一段內存(相互覆蓋)共用體類型定義union 共用體名 類型標識符 成員名; 類型標識符 成員名; .;例 union data int i; char ch; float f; ;類型定義不分配內存7.2 聯(lián)合體union7.2 聯(lián)合體unionstruct number short i; char ch; float f;0 x0037b00union number short i; char

21、ch; float f;printf(%dn, sizeof(struct number);ichf8個字節(jié)ichf4個字節(jié)printf(%dn, sizeof(union number);聯(lián)合體類型變量占用的存儲空間由占有最大存儲區(qū)的成員決定形式二: union data int i; char ch; float f; a,b;形式一: union data int i; char ch; float f; ; union data a,b,c,*p,d3;形式三: union int i; char ch; float f; a,b,c;聯(lián)合體變量的定義fchifchiab共用體變量定義

22、分配內存,長度=最長成員所占字節(jié)數(shù)共用體變量任何時刻只有一個成員存在聯(lián)合體變量引用引用規(guī)那么不能引用共用體變量,只能引用其成員共用體指針名-成員名共用體變量名.成員名(*共用體指針名).成員名共用體變量中起作用的成員是最后一次存放的成員例 union int i; char ch; float f; a; a=1; () 在定義共用體變量時只能初始化第一個成員例 union int i; char ch; float f; a=1,a,1.5; () 可以用一個共用體變量為另一個變量賦值例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; ()7.2 聯(lián)合體union0 x0037b00同一內存單元在每一瞬時只能存放其中一種類型的成員,互相覆蓋 ;起作用的成員是最后一次存放的成員不能作為函數(shù)參數(shù)不能給聯(lián)合體變量名直接賦值 f4個字節(jié)struct person char name20; char sex; int age; union int single;

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論