第7章復合結(jié)構(gòu)類型課件_第1頁
第7章復合結(jié)構(gòu)類型課件_第2頁
第7章復合結(jié)構(gòu)類型課件_第3頁
第7章復合結(jié)構(gòu)類型課件_第4頁
第7章復合結(jié)構(gòu)類型課件_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C語言程序設(shè)計第7章復合結(jié)構(gòu)類型第1章C語言概述第2章基本數(shù)據(jù)類型和運算第3章結(jié)構(gòu)化程序設(shè)計第5章函數(shù)第6章指針第7章復合結(jié)構(gòu)類型第8章編譯預(yù)處理第4章數(shù)組及字符串●課程概述第9章文件7.1結(jié)構(gòu)體7.2共用體7.3結(jié)構(gòu)體和共用體的區(qū)別7.4用typedef定義類型復合結(jié)構(gòu)類型第7章教學目標?掌握結(jié)構(gòu)體類型的定義和使用方法?掌握共用體類型的定義和使用方法?掌握結(jié)構(gòu)體指針的定義和使用方法7.1結(jié)構(gòu)體所謂“結(jié)構(gòu)體類型”是由不同數(shù)據(jù)類型變量組成的集合體,相當于其他高級語言中的記錄。結(jié)構(gòu)體類型的數(shù)據(jù)由若干稱為“成員”的數(shù)據(jù)組成,每個成員既可以是一個基本數(shù)據(jù)類型的數(shù)據(jù),也可以是另一個構(gòu)造類型的數(shù)據(jù)。7.1.1結(jié)構(gòu)體的概念例如:定義一個嬰兒的出生證明的結(jié)構(gòu)體。structbaby{charname[20];/*嬰兒姓名*/charsex;/*性別*/chardate[20];/*出生日期*/charnum[30];floatweight;/*出生時的體重*/charplace[30];/*出生地*/};結(jié)構(gòu)體類型定義的一般格式為:struct結(jié)構(gòu)體名{數(shù)據(jù)類型1成員名1;

數(shù)據(jù)類型2成員名2;

數(shù)據(jù)類型3成員名3;……

數(shù)據(jù)類型n成員名n;};其中:1、struct是關(guān)鍵字,結(jié)構(gòu)體名是標識符;

2、數(shù)據(jù)類型可以是基本類型、定義過的結(jié)構(gòu)體類型名、共用體型等;

3、成員名是標識符;

4、各成員的定義語句放在花括號中;

5、花括號后面的分號是整個定義語句的結(jié)尾。7.1結(jié)構(gòu)體7.1.2結(jié)構(gòu)體類型的定義說明例7.1

將學籍管理記錄定義成一個名為structstudent的結(jié)構(gòu)體類型。structstudent{charnumber[5],*name;/*學號和姓名*/charsex;/*性別*/intage;/*年齡*/floatscore;/*總分*/char*speciality/*專業(yè)*/;charschool[31];/*學校*/};7.1結(jié)構(gòu)體7.1.3結(jié)構(gòu)體類型的定義舉例7.1.4定義結(jié)構(gòu)體類型時需要注意的問題(1)類型與變量是不同的概念,不要混淆。(2)每個成員都必須有自己的數(shù)據(jù)類型??梢詥为毷褂?。(3)結(jié)構(gòu)體成員可以和程序中的其他標識符同名,也可以和另一個結(jié)構(gòu)體的成員同名。(4)結(jié)構(gòu)體類型定義的位置,可以在函數(shù)內(nèi)部,也可以在函數(shù)外部。(5)注意結(jié)構(gòu)體和數(shù)組之間的區(qū)別:數(shù)組里放的都是類型相同的數(shù)據(jù)(例如在一個箱子里放的全是蘋果);而結(jié)構(gòu)體中可以放不同類型的數(shù)據(jù)(例如在一個箱子里既放有蘋果,又放有桃、香蕉等不同的水果)。7.1結(jié)構(gòu)體結(jié)構(gòu)體型的定義可以嵌套,即某個結(jié)構(gòu)體型成員的數(shù)據(jù)類型可以說明為另一個已定義過的結(jié)構(gòu)體類型。例如將上面定義的結(jié)構(gòu)體類型中的成員“age”改為出生日期“birthday”。由于出生日期包含年、月、日三個整型數(shù)據(jù),可以將它定義成另外一個名為structdate的結(jié)構(gòu)體類型的變量,并將該變量作為結(jié)構(gòu)體類型structstudent的一個成員,即structdate{intyear;intmonth;intday;};7.1.5結(jié)構(gòu)體類型的嵌套定義7.1結(jié)構(gòu)體/*structstudent結(jié)構(gòu)體的定義如下*/structstudent{charnum[5],*name,sex,*speciality,school[31];structdatebirthday;floatscore;};structstudent{charnumber[5],*name;charsex;structdate{intyear;intmonth;intday;}birthday;floatscore;char*speciality;charschool[31];};/*structstudent結(jié)構(gòu)體也可以寫成嵌套定義的形式:

*/7.1.5結(jié)構(gòu)體類型的嵌套定義7.1結(jié)構(gòu)體一般形式:struct結(jié)構(gòu)體名{

成員列表}變量名列表;例如:structstudent{intnum;charname[20];intage;charsex;charplace[20];};structstudentm,n;/*定義結(jié)構(gòu)體變量m和n*/7.1.5結(jié)構(gòu)體變量的定義7.1結(jié)構(gòu)體先定義結(jié)構(gòu)體后定義變量定義結(jié)構(gòu)體類型的同時定義變量直接說明結(jié)構(gòu)變量一般形式:struct結(jié)構(gòu)體名{

成員列表}變量名列表;例如:structstudent{intnum;charname[20];intage;charsex;charplace[20];}m,n;/*定義結(jié)構(gòu)體變量m和n*/7.1.5結(jié)構(gòu)體變量的定義7.1結(jié)構(gòu)體先定義結(jié)構(gòu)體后定義變量定義結(jié)構(gòu)體類型的同時定義變量直接說明結(jié)構(gòu)變量7.1.5結(jié)構(gòu)體變量的定義7.1結(jié)構(gòu)體先定義結(jié)構(gòu)體后定義變量定義結(jié)構(gòu)體類型的同時定義變量直接說明結(jié)構(gòu)變量一般形式:struct{

成員表列}變量名表列;這種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)體名,而在后面直接給出結(jié)構(gòu)體變量。例如:struct{intnum;charname[20];intage;charsex;charplace[20];}m,n;/*定義結(jié)構(gòu)體變量m和n*/結(jié)構(gòu)體變量的初始化形式與前面介紹的數(shù)組相似,只要把對應(yīng)各成員的初值放在花括號(即初值表)中即可。7.1結(jié)構(gòu)體7.1.6結(jié)構(gòu)體變量的初始化和引用例7.2

結(jié)構(gòu)體變量的初始化。#include<stdio.h>structstudent{intnumber;charname[20];charsex;structdate{intyear;intmonth;intday;}birthday;floatscore;charspeciality[11];charschool[31];};主函數(shù)如下:main(){structstudentst1={"1001","Liming",'0',1983,10,25,573,"Computer","3thHighSchool,Beijing"};/*結(jié)構(gòu)體變量st1的定義和初始化*/printf("%4d%-10s%c%4d%2d%2d%.2f%-10s%s\n",st1.number,,st1.sex,st1.birthday.year,st1.birthday.month,st1.birthday.day,st1.score,st1.speciality,st1.school);/*輸出結(jié)構(gòu)體變量st1的各數(shù)據(jù)項*/}7.1結(jié)構(gòu)體7.1.6結(jié)構(gòu)體變量的初始化和引用下面是上述程序的運行情況:1001Liming019831025573.00Computer3thHighschool,Beijing7.1.7結(jié)構(gòu)體變量的引用7.1結(jié)構(gòu)體不能直接使用結(jié)構(gòu)體變量,只能通過引用其中的成員來實現(xiàn)對結(jié)構(gòu)體變量的使用。引用結(jié)構(gòu)體變量成員的一般形式為:結(jié)構(gòu)體變量名.成員名例7.3結(jié)構(gòu)體變量成員的引用。#include"string.h"structstudent/*定義student類型的變量*/{intnum;charname[20];charsex;floatscore;};main(){structstudentm;m.num=20048;/*給結(jié)構(gòu)體變量x的成員num賦值*/strcpy(,"zhangsan");m.sex='f';m.score=95;printf("num=%dname=%ssex=%cscore=%f",m.num,,m.sex,m.score);/*輸出結(jié)構(gòu)體變量m的各數(shù)據(jù)項的值*/}下面是上述程序的運行情況:num=20048name=zhangsansex=fscore=95.0000007.2.1共用體的概念7.2共用體共用體由若干個數(shù)據(jù)類型組合而成。和結(jié)構(gòu)體型不同的是,共用體數(shù)據(jù)中所有成員都占用相同的內(nèi)存單元,設(shè)置這種數(shù)據(jù)類型的主要目的就是節(jié)省內(nèi)存空間。例7.14在一個函數(shù)的三個不同的程序段中分別使用了字符型變量c1、整型變量d1、單精度型變量f1,這時就可以把它們定義成一個共用體變量un,un中含有三個不同類型的成員。為了節(jié)省空間,假如現(xiàn)在只給三個成員一共分配4個內(nèi)存單元,那么3個成員之間的對應(yīng)關(guān)系如下圖7-4所示。共用體變量un7.2.1共用體的概念7.2共用體共用體由若干個數(shù)據(jù)類型組合而成。和結(jié)構(gòu)體型不同的是,共用體數(shù)據(jù)中所有成員都占用相同的內(nèi)存單元,設(shè)置這種數(shù)據(jù)類型的主要目的就是節(jié)省內(nèi)存空間。例7.14在一個函數(shù)的三個不同的程序段中分別使用了字符型變量c1、整型變量d1、單精度型變量f1,這時就可以把它們定義成一個共用體變量un,un中含有三個不同類型的成員。為了節(jié)省空間,假如現(xiàn)在只給三個成員一共分配4個內(nèi)存單元,那么3個成員之間的對應(yīng)關(guān)系如下圖7-4所示。共用體變量un7.2.2共用體類型的定義7.2共用體共用體定義的一般形式為:union共用體名{數(shù)據(jù)類型1成員名1;

數(shù)據(jù)類型2成員名2;…

數(shù)據(jù)類型n成員名n;};共用體名是用戶自定義的標識符;數(shù)據(jù)類型通常是前面所使用的基本數(shù)據(jù)類型,也可以是結(jié)構(gòu)體型、共用體型等構(gòu)造類型。例如,以下代碼說明了一個共用體un1:unionun1{inta[100];charm[100];floatn[200];};其中,成員a占用了200個單元的內(nèi)存空間,因為a為整型,而一個整型占2個單元的空間,所以2×100=200。同理,成員m占用了1×100=100個內(nèi)存單元;成員n占用了4×200=800個內(nèi)存單元,所以,該共用體共占用了800個單元空間。7.2.3共用體變量的定義7.2共用體共用體變量定義的方法也有三種:(1)先說明共用體,再定義共用體變量。(2)在說明共用體類型的同時定義共用體變量。(3)直接定義共用體變量。例如,將含有10個元素的整型數(shù)組m[10]、字符型數(shù)組n[3][5]、雙精度數(shù)據(jù)a定義成一個共用體un,然后再定義這個共用體的變量x和y。下面分別用上述的三種方法進行定義。(3)定義無名稱的共用體,同時定義變量x和y。union{intm[10];charn[3][5];doublea;}x,y;(1)先定義共用型,然后再定義變量x和y。unionun{intm[10];/*該成員共占用了20個單元空間*/charn[3][5];/*該成員共占用了15個單元空間*/doublea;/*該成員共占用了8個單元空間*/};/*該共用體共占用了20個單元空間*/unionunx,y;/*定義兩個共用體變量x和y*/(2)同時定義共用體un和變量x、y。unionun{intm[10];charn[3][5];doublea;}x,y;共用體變量與函數(shù)7.2.4共用體變量的引用7.2共用體通過指向共用體變量的指針進行引用直接引用共用體變量成員的直接引用是通過運算符“.”實現(xiàn)的。其引用的一般格式為:共用體變量名.成員名例如:union{intm;charch;doublea;}x;…printf("%d,%c,%lf",x.m,x.ch,x.a);上述printf語句中的x.m、x.ch、x.a是對共用體變量x成員m、ch、a的引用。共用體變量與函數(shù)7.2.4共用體變量的引用7.2共用體通過指向共用體變量的指針進行引用直接引用其一般的語法格式為:指向結(jié)構(gòu)體變量的指針->成員名或(*指向結(jié)構(gòu)體變量的指針).成員名例7.15通過共用體變量的指針對共用體變量中的成員進行引用的應(yīng)用舉例。#include<stdio.h>unionstu/*定義共用體*/{char*name;intnum;};main(){unionstu*p,stuone;/*定義共用體指針和共用體變量*/p=&stuone;/*指針p指向共用體變量stuone*/stuone.num=101;/*為stuone的成員num賦值*/printf("%d\n",p->num);/*用指針輸出num的值*/}共用體變量與函數(shù)7.2.4共用體變量的引用7.2共用體通過指向共用體變量的指針進行引用直接引用共用體變量本身不能作為函數(shù)的參數(shù),但共用體成員可以在函數(shù)中進行引用。而且函數(shù)也不能返回共用體變量。但是指向共用體變量的指針可以作為函數(shù)的參數(shù),返回值也可以是指向共用體變量的指針。例7.17共用體變量的成員和共用體指針作函數(shù)參數(shù)的應(yīng)用舉例。#include<stdio.h>uniontraffic{ char*name; intnum;};voidroad(char*x)/*定義road函數(shù)*/{ printf("Thenameoftrafficis%s!\n",x);}voidair(uniontraffic*x)/*定義air函數(shù)*/{ printf("Thenameoftrafficis%s!\n",x->name);共用體變量與函數(shù)7.2.4共用體變量的引用7.2共用體通過指向共用體變量的指針進行引用直接引用main(){ uniontraffic*p,traone;/*定義共用體指針和共用體變量*/ p=&traone;/*指針p指向共用體變量traone*/ ="Car";/*為變量traone的成員name賦值*/ road();/*調(diào)用road函數(shù)*/ air(p);/*調(diào)用air函數(shù)*/}程序的運行結(jié)果為:Thenameoftrafficiscar!Thenameoftrafficiscar!7.2.5共用體類型數(shù)據(jù)的特點7.2共用體(1)共用體中的多個成員共用一個內(nèi)存段,但一瞬間只有一個成員占用內(nèi)存段,即每一瞬時只有一個成員存在和起作用。(2)共用體變量的地址和共用體各個成員的地址都是同一個地址。例如:unoinsr{charch1;floata;};unionsrstr;/*定義共用體變量str*/此時,&str、&str.ch1、&str.a的地址值是同一個。(3)共用體中起作用的成員是最后一次存放的成員。例如:unoincc{inta;intb;intc;};unoinccch1;/*定義共用體變量ch1*/ch1.a=2;/*為ch1的成員a賦值*/ch1.b=3;/*為ch1的成員b賦值*/ch1.c=4;/*為ch1的成員c賦值*/此時若執(zhí)行以下語句:printf("%d",ch1.a);printf("%d",ch1.b);printf("%d",ch1.c);則三條語句的輸出結(jié)果均為4。7.2.5共用體類型數(shù)據(jù)的特點7.2共用體7.2.5共用體類型數(shù)據(jù)的特點7.2共用體(4)共用體類型可以在結(jié)構(gòu)體類型中定義,結(jié)構(gòu)體類型也可以在共用體類型中定義。例如:以下共用體cc的成員中就有結(jié)構(gòu)體類型的變量bb。unoincc/*定義共用體*/{inta;charb[20];structdd{inti;intj;}bb;/*定義結(jié)構(gòu)體變量bb*/};(5)共用體類型可以嵌套定義。例如:

unoinaa{inta;charb[20];unoinbb{inti;intj;}c;/*定義共用體變量c*/};7.2.5共用體類型數(shù)據(jù)的特點7.2共用體(6)不能對共用體變量名賦值,也不能通過引用變量名得到一個值。(7)共用體類型的變量不能作為函數(shù)的參數(shù),也不能使函數(shù)返回共用體變量。但可以使用共用體變量的指針。(8)不能在定義共用體變量時對其進行初始化。例如下面的初始化是錯誤的:unoincc{inta;intb;intc;}s={2,3,4};1.if語句

if…else7.3結(jié)構(gòu)體和共用體的區(qū)別結(jié)構(gòu)體和共用體之間存在著以下的區(qū)別:(1)結(jié)構(gòu)體和共用體都是由多個不同的數(shù)據(jù)類型成員組成,但在同一時刻,共用體中只存放一個被選中的成員,而結(jié)構(gòu)體的所有成員都存在。(2)對共用體的不同成員賦值,將會造成對其他成員的重寫,原來成員的值就不存在了,而對于結(jié)構(gòu)體的不同成員賦值是互不影響的。例7.18共用體和結(jié)構(gòu)體應(yīng)用舉例。#include<stdio.h>main(){union/*

溫馨提示

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

評論

0/150

提交評論