結(jié)構(gòu)體和公用體_第1頁
結(jié)構(gòu)體和公用體_第2頁
結(jié)構(gòu)體和公用體_第3頁
結(jié)構(gòu)體和公用體_第4頁
結(jié)構(gòu)體和公用體_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C語語言言程程序序設(shè)設(shè)計計 中北大學(xué)計算機(jī)科學(xué)與技術(shù)系C語語言言程程序序設(shè)設(shè)計計 第節(jié)第節(jié) 結(jié)構(gòu)體結(jié)構(gòu)體. .結(jié)構(gòu)體類型定義結(jié)構(gòu)體類型定義第第1111章章 結(jié)構(gòu)體和公用體結(jié)構(gòu)體和公用體結(jié)構(gòu)體是結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型一種構(gòu)造數(shù)據(jù)類型用途:把不同類型的數(shù)據(jù)組合成一個整體,用途:把不同類型的數(shù)據(jù)組合成一個整體,是一種自定義數(shù)據(jù)類型是一種自定義數(shù)據(jù)類型struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名成員名; .;成員類型可以是基本型或構(gòu)造型struct是關(guān)鍵字,不能省略合法標(biāo)識符可省:無名結(jié)構(gòu)體結(jié)構(gòu)體類型可以定義在函數(shù)內(nèi),也可以結(jié)構(gòu)體類型可以定義在

2、函數(shù)內(nèi),也可以定義在函數(shù)外(作用域問題)定義在函數(shù)外(作用域問題)C語語言言程程序序設(shè)設(shè)計計 例 struct student int num; char name20; char sex; int age; float score; char addr30; ; namenumsexagescoreaddr2字節(jié)2字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié).結(jié)構(gòu)體類型定義描述結(jié)構(gòu)結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式的組織形式,不分配內(nèi)存不分配內(nèi)存結(jié)構(gòu)體類結(jié)構(gòu)體類型標(biāo)識符型標(biāo)識符C語語言言程程序序設(shè)設(shè)計計 2.2.結(jié)構(gòu)體類型變量定義結(jié)構(gòu)體類型變量定義1) 先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量先定義結(jié)構(gòu)體類型,

3、再定義結(jié)構(gòu)體變量一般形式:一般形式: struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; .;struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 變量名表列變量名表列;例 #define STUDENT struct student STUDENT short int num; char name20; char sex; short int age; float score; char addr30; ; STUDENT stu1,stu10,*p; 例 struct student short int num; char name20; char s

4、ex; short int age; float score; char addr30; ; struct student stu1,stu10,*p; C語語言言程程序序設(shè)設(shè)計計 2)定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量)定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量一般形式:一般形式:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; .變量名表列變量名表列;例 struct student short int num; char name20; char sex; short int age; float score; char addr30

5、; stu1,stu10,*p; C語語言言程程序序設(shè)設(shè)計計 3) 直接定義結(jié)構(gòu)體變量直接定義結(jié)構(gòu)體變量一般形式一般形式:struct 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; .變量名表列變量名表列;例 struct short int num; char name20; char sex; short int age; float score; char addr30; stu1,stu10,*p; 用用無名結(jié)構(gòu)體無名結(jié)構(gòu)體直接定義直接定義變量變量只能一次只能一次C語語言言程程序序設(shè)設(shè)計計 說明:說明: 結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同結(jié)構(gòu)體類型與結(jié)構(gòu)體

6、變量概念不同 類型類型:不分配內(nèi)存;不分配內(nèi)存; 變量變量:分配內(nèi)存分配內(nèi)存 類型類型:不能賦值、存取、運(yùn)算不能賦值、存取、運(yùn)算; 變量變量:可以可以 結(jié)構(gòu)體可嵌套結(jié)構(gòu)體可嵌套 結(jié)構(gòu)體成員名與程序中變量名可相同,不會混淆結(jié)構(gòu)體成員名與程序中變量名可相同,不會混淆 結(jié)構(gòu)體類型及變量的作用域與生存期結(jié)構(gòu)體類型及變量的作用域與生存期例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu;numnamebirthdaymonthdayyear

7、例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu;numnamebirthdaymonthdayyearC語語言言程程序序設(shè)設(shè)計計 3. 3.結(jié)構(gòu)體變量的引用結(jié)構(gòu)體變量的引用 引用規(guī)則:引用規(guī)則: 結(jié)構(gòu)體變量成員具備和普通變量相同的性質(zhì)結(jié)構(gòu)體變量成員具備和普通變量相同的性質(zhì) 引用運(yùn)算符:引用運(yùn)算符:結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名.成員名成員名 指向運(yùn)算符:指向運(yùn)算符:結(jié)構(gòu)體變量名結(jié)構(gòu)體變量名-成員名成員名 可以將一個結(jié)構(gòu)體變量賦值給另一個結(jié)構(gòu)體變量可以將一個結(jié)構(gòu)

8、體變量賦值給另一個結(jié)構(gòu)體變量 結(jié)構(gòu)體嵌套時逐級引用結(jié)構(gòu)體嵌套時逐級引用 例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu10,*p=&stu1; stu1.num=10; stu1.score=85.5;stu0=stu1;(stu+5)-age=20;p-sex=F;例例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1; p

9、rintf(“%d,%s,%c,%d,%f,%sn”,stu1); ( )stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; ( )例例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1;numnamebirthdaymonthdayyearstu1.birthday.month=12;C語語言言程程序序設(shè)設(shè)計計 4 4 結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量的初始化形式一:形式一:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型標(biāo)識符類型標(biāo)識符 成員名

10、;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; .;struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 結(jié)構(gòu)體變量結(jié)構(gòu)體變量=初始數(shù)據(jù)初始數(shù)據(jù);例例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;C語語言言程程序序設(shè)設(shè)計計 形式二形式二:struct 結(jié)構(gòu)體名結(jié)構(gòu)體名 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; .結(jié)構(gòu)體變量結(jié)構(gòu)體變量=初始數(shù)據(jù)初始數(shù)據(jù);例例 s

11、truct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; C語語言言程程序序設(shè)設(shè)計計 形式三:形式三:struct 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; .結(jié)構(gòu)體變量結(jié)構(gòu)體變量=初始數(shù)據(jù)初始數(shù)據(jù);例例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 B

12、eijing Road”; C語語言言程程序序設(shè)設(shè)計計 5 5 結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組1)結(jié)構(gòu)體數(shù)組的定義的三種形式:)結(jié)構(gòu)體數(shù)組的定義的三種形式:形式一: struct student int num; char name20; char sex; int age; ;struct student stu2;numnamesexagenumnamesexagestu0stu125B形式二: struct student int num; char name20; char sex; int age; stu2;形式三: struct int num; char name20; char sex

13、; int age; stu2;C語語言言程程序序設(shè)設(shè)計計 2)結(jié)構(gòu)體數(shù)組初始化和引用)結(jié)構(gòu)體數(shù)組初始化和引用順序初始化: 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; 分行初始化: struct student int num; char name20; char sex; int age; ;struct student stu =100,“Wang Lin”,M

14、,20, 101,“Li Gang”,M,19, 110,“Liu Yan”,F,19; 全部初始化時維數(shù)可省 struct student int num; char name20; char sex; int age; stu3,*p=stu;stu1.age+;strcpy(,”ZhaoDa”);for(i=20;page=i+;for(i=20;pnum,&p-sex, &p-age); gets(p-name);struct student int num; char name20; char sex; int age;stu3=10101,Li L

15、in,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20;main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age);numnamesexagestu0pstu1stu2p+1C語語言言程程序序設(shè)設(shè)計計 例例 統(tǒng)計后選人選票統(tǒng)計后選人選票struct person char name20; int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) sca

16、nf(%s,leader_name); for(j=0;j3;j+)if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;ia=18; parm-b=5; parm-c=parm-a*parm-b; printf(parm-a=%d parm-b=%d parm-c=%dn, parm-a,parm-b,parm-c);arga :18b: 5c :90(main)arga :27b: 3c :30(main)例 用結(jié)構(gòu)體指針變量作函數(shù)參數(shù)arga :27b: 3c :30(main)(func)parm*arga :18

17、b: 5c :90(main)(func)parm*C語語言言程程序序設(shè)設(shè)計計 第第2節(jié)節(jié) 內(nèi)存的動態(tài)分配與單向鏈表內(nèi)存的動態(tài)分配與單向鏈表1.動態(tài)內(nèi)存分配動態(tài)內(nèi)存分配 動態(tài)內(nèi)存分配的目的動態(tài)內(nèi)存分配的目的 在執(zhí)行過程中為數(shù)據(jù)對象分配合適的存儲空間在執(zhí)行過程中為數(shù)據(jù)對象分配合適的存儲空間 動態(tài)內(nèi)存分配的使用場合動態(tài)內(nèi)存分配的使用場合 不能在執(zhí)行前確定數(shù)據(jù)對象的存儲空間大小不能在執(zhí)行前確定數(shù)據(jù)對象的存儲空間大小 不適合在執(zhí)行前為數(shù)據(jù)對象分配存儲空間不適合在執(zhí)行前為數(shù)據(jù)對象分配存儲空間 動態(tài)內(nèi)存分配函數(shù):動態(tài)內(nèi)存分配函數(shù):“stdlib.h” 或或 “malloc.h” void* malloc(

18、 unsigned int size ); void* calloc( unsigned int n, unsigned int size ); void free( void* memblock );C語語言言程程序序設(shè)設(shè)計計 例:編寫函數(shù),將某個字符轉(zhuǎn)換為從其開始的五個字符構(gòu)成的例:編寫函數(shù),將某個字符轉(zhuǎn)換為從其開始的五個字符構(gòu)成的字符串字符串#include char * CharToString(char ch) char* p; int i; p = (char *)malloc( 6 ); for(i=0;i5;i+)pi=ch+i; p5 = 0; return( p );mai

19、n()printf(“%sn”, CharToString(a);Char * CharToString(char ch) char array6; int i; for(i=0;i5;i+)arrayi=ch+i; array5 = 0; return( array ); p = (char *)calloc( 6,sizeof(char) );運(yùn)算符運(yùn)算符sizeof(類型標(biāo)識符)是計算該類型標(biāo)識符)是計算該類型的長度類型的長度C語語言言程程序序設(shè)設(shè)計計 #include stdlib.hmain()int *p,*m,n=10;p=(int *)calloc(n,sizeof(int);

20、for(m=p;mp+n;m+)scanf(%d,m);for(m=p;mp+n;m+)printf(%d ,*m);printf(n);free(void *)p);for(m=p;mname,p-height,p-weight,p-age);p=p-next;C語語言言程程序序設(shè)設(shè)計計 struct listint data;struct list *next;*p,*q;data next10 data nextp5 0 data next5 q使使q插入到插入到p后,如何實(shí)現(xiàn):后,如何實(shí)現(xiàn):1.p-next=q;q-next=p-next;2.q.next=p.next;p.next=

21、q;3.q-next=p-next;p-next=q;4.(*p)-next=p-next;(*p)-next=q;C語語言言程程序序設(shè)設(shè)計計 第第3節(jié)節(jié) 公用體公用體構(gòu)造數(shù)據(jù)類型構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體也叫聯(lián)合體用途:使幾個不同類型的變量共占一段內(nèi)存用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋相互覆蓋)1.公用體類型定義公用體類型定義union 共用體名共用體名 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; 類型標(biāo)識符類型標(biāo)識符 成員名;成員名; .;例例 union data int i; char ch; float f; ;fchi類型定義類型定義不分配內(nèi)存不分配內(nèi)存C語語言言程程序序設(shè)

22、設(shè)計計 形式一: 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;2.公用體變量的定義公用體變量的定義fchifchiab共用體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)共用體變量任何時刻只有一個成員存在C語語言言程程序序設(shè)設(shè)計計 3.公用體變量引用公用體變量引用 引用方式:例例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”

23、,a.i); ( 編譯通過,運(yùn)行結(jié)果不對編譯通過,運(yùn)行結(jié)果不對) 引用規(guī)則 不能引用共用體變量,只能引用其成員共用體指針名共用體指針名-成員名成員名共用體變量名共用體變量名.成員名成員名union data int i; char ch; float f; ; union data a,b,c,*p,d3;a.i a.ch a.fp-i p-ch p-f(*p).i (*p).ch (*p).fd0.i d0.ch d0.f 共用體變量中起作用的成員是共用體變量中起作用的成員是最后一次存放的成員最后一次存放的成員例例 union int i; char ch; float f; a; a=1;

24、 ( ) 不能不能在定義共用體變量時在定義共用體變量時初始化初始化例例 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; ( )C語語言言程程序序設(shè)設(shè)計計 例 將一個整數(shù)按字節(jié)輸出01100001 01000001低字節(jié)高字節(jié)0100000101100001ch0ch1運(yùn)行結(jié)果:運(yùn)行結(jié)果:i=60501ch0=101,ch1=141ch0=A,

25、ch1=amain() union int_char int i; char ch2; x; x.i=24897; printf(i=%on,x.i); printf(ch0=%o,ch1=%on ch0=%c,ch1=%cn, x.ch0,x.ch1,x.ch0,x.ch1);C語語言言程程序序設(shè)設(shè)計計 4.結(jié)構(gòu)體與共用體結(jié)構(gòu)體與共用體 區(qū)別區(qū)別: 存儲方式不同存儲方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k變量的各成員同時存在任一時刻只有一個成員存在 聯(lián)系聯(lián)系: 兩者可相互嵌套兩者可相互嵌套

26、C語語言言程程序序設(shè)設(shè)計計 例共用體中嵌套結(jié)構(gòu)體,機(jī)器字?jǐn)?shù)據(jù)與字節(jié)數(shù)據(jù)的處理 00010010 00110100低字節(jié)低字節(jié)高字高字節(jié)節(jié)0011010000010010lowhigh0 x1234struct w_tag char low; char high;union u_tag struct w_tag byte_acc; int word_acc;u_acc;word_accbyte_acc.lowbyte_acc.highu_accC語語言言程程序序設(shè)設(shè)計計 第4節(jié) typedef定義類型 功能:用自定義名字為已有數(shù)據(jù)類型命名 類型定義簡單形式: typedef type name;類型定義語句關(guān)鍵字已有數(shù)據(jù)類型名用戶定義的類型名例 typedef int INTEGER;例 typedef float REAL;類型定義后,與已有類型一樣使用例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 說明說明: :1.typedef 1.typedef 沒有創(chuàng)造沒有創(chuàng)造新數(shù)據(jù)類型新數(shù)據(jù)類型2.2.typ

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論