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

下載本文檔

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

文檔簡(jiǎn)介

1、結(jié)構(gòu)體與共用體小結(jié),結(jié)構(gòu)體的概念和定義1,結(jié)構(gòu)體的定義struct結(jié)構(gòu)體名數(shù)據(jù)類型成員名1 ;數(shù)據(jù)類型成員名1 ;這里數(shù)據(jù)類型可以是復(fù)合類型,例如又是一個(gè)結(jié)構(gòu)體類型,即嵌套;2,結(jié)構(gòu)體變量的定義或:struct結(jié)構(gòu)體名struct結(jié)構(gòu)體名變量名1,變量名2,,變量名 n ;數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名1;結(jié)構(gòu)體變量1,結(jié)構(gòu)體變量2 ;或:struct數(shù)據(jù)類型成員名1 ;數(shù)據(jù)類型成員名1 ;結(jié)構(gòu)體變量1,結(jié)構(gòu)體變量2 ;三種方式,第三種方式的話,每次要定義這個(gè)類型的結(jié)構(gòu)體變量都要重復(fù)的寫這段代碼;其實(shí)定義了結(jié)構(gòu)體后,struct結(jié)構(gòu)體名就是一種新的類型,上述語(yǔ)句就像聲明變量一樣;3,結(jié)構(gòu)體變

2、量的引用只能對(duì)結(jié)構(gòu)體變量中的各個(gè)成員分別輸岀,不能對(duì)一個(gè)結(jié)構(gòu)體變量作為一個(gè)整體輸岀;嵌套的結(jié)構(gòu)體類型的引用:結(jié)構(gòu)體變量名.結(jié)構(gòu)體類型成員名.內(nèi)嵌結(jié)構(gòu)體的成員名;4,結(jié)構(gòu)體變量的初始化struct結(jié)構(gòu)體名變量名=初始化數(shù)據(jù);或者在定義的時(shí)候就初始化:數(shù)據(jù)類型成員名1 ;struct結(jié)構(gòu)體名數(shù)據(jù)類型成員名1;變量名=初始化數(shù)據(jù);二,結(jié)構(gòu)體數(shù)組1,結(jié)構(gòu)體數(shù)組的定義舉例struct Stuint Stu nuchar n ame20;float score;;或者:struct stustruct Stu stude nt5;int Stu nu char name20;float score;stu

3、de nt5;或者:struct int Stu nu char n ame20;float score;stude nt5;跟定義結(jié)構(gòu)體變量的三種形式是一樣的,只不過這里每次定義的結(jié)構(gòu)體變量是個(gè)數(shù)組;每一個(gè) studenti 都是struct stu類型的;2,結(jié)構(gòu)體數(shù)組的初始化和引用略;三,結(jié)構(gòu)體與指針1,指向結(jié)構(gòu)體的指針的定義,同上,也是三種形式;struct empio yees empio yee1,* p1;或者:struct empio yeesemplo yee1,* p1;或者:structemp loyeel,* p1;然后可進(jìn)行如下操作:p1 = &employe

4、el; 此時(shí)p1指向首地址;2,用結(jié)構(gòu)體變量指針來引用結(jié)構(gòu)體成員的兩種操作:(*結(jié)構(gòu)體變量的指針名).成員名;如:(*p1).name ;括號(hào)不能省略,.的優(yōu)先級(jí)是最高的;或:結(jié)構(gòu)體變量的指針名-> 成員名;女n: p1->name注意.和-> 的優(yōu)先級(jí)是最高的;emplo yee1. name;(*p 1). name ;p1->n ame是等價(jià)的;3,結(jié)構(gòu)體數(shù)組與指針struct Stuint Stu nuchar n ame20;float score;stude nt5P;此時(shí)可以把數(shù)組student的起始地址賦給P :P = stude nt;此時(shí)P 指向 s

5、tudent0;也可把student的其他元素的地址賦給 Pp = & stude nt3(3)利用指針移動(dòng)如P+使P指向結(jié)構(gòu)體數(shù)組的不同元素;四,結(jié)構(gòu)體作為函數(shù)參數(shù)1,結(jié)構(gòu)體變量作為函數(shù)參數(shù)2,指向結(jié)構(gòu)體變量的指針作為函數(shù)參數(shù)略,在后續(xù)文章里將給岀一個(gè)例子;共用體的概念在C+語(yǔ)言中,不同數(shù)據(jù)類型的數(shù)據(jù)可以使用共同的存儲(chǔ)區(qū)域,這種數(shù)據(jù)構(gòu)造 類型稱為共用體,簡(jiǎn)稱共用,又稱聯(lián)合體。共用體在定義、說明和使用形式上與 結(jié)構(gòu)體相似。兩者本質(zhì)上的不同僅在于使用內(nèi)存的方式上。 定義一個(gè)共用體類型 的一般形式為:union共用體名成員表列;;例如:union gytint i;char c;float

6、 f;;就定義了一個(gè)共用體類型union gyt,它由三個(gè)成員組成,這三個(gè)成員在內(nèi)存中使用共同的存儲(chǔ)空間。由于共用體路各成員的數(shù)據(jù)長(zhǎng)度往往不同, 所以共用體變量 在存儲(chǔ)時(shí)總是按其成員中數(shù)據(jù)長(zhǎng)度最大的成員占用內(nèi)存空間。如:共用體類型union gyt的變量占用4個(gè)字節(jié)的內(nèi)存。在這一點(diǎn)上共用體與結(jié)構(gòu)體不同,結(jié)構(gòu)體類型變量在存儲(chǔ)時(shí)總是掃各成員的數(shù)據(jù) 長(zhǎng)度之和占用內(nèi)存空間。如,定義了一個(gè)結(jié)構(gòu)體類型:struct gyt int i;char c;float f;則結(jié)構(gòu)體類型struct gyt的變量占用的內(nèi)存為2+1+4個(gè)字節(jié),也就是7個(gè)字節(jié)。定義共用體變量的方法與定義結(jié)構(gòu)體類型變量的方法相似,也有三

7、種方法:union共用體名成員表列;變量表列;如:union gyt int i;char c;float f;a,b,c;區(qū)分共用體類型定義與共用體變量定義union gytint i;char c;float f;; union gyt a,b,c;直接定義共用體變量:union int i;char c;float f;a,bc;與結(jié)構(gòu)體類似,也可以定義共用體指針和共用體數(shù)組。union共用體名*共用指針名;union共用體名 數(shù)組名元素個(gè)數(shù);例如:union gyt *pu;和共用體數(shù)組u13。union gyt u13; /分別定義了共用體指針 pu共用體變量的使用形式由于共用體變量

8、的各個(gè)成員使用共同的內(nèi)存區(qū)域,所以共用體變量的內(nèi)存空間在某個(gè)時(shí)刻只能保持某個(gè)成員的數(shù)據(jù)。由此可知,在程序中參加運(yùn)算的必然是共用成了三個(gè)賦值運(yùn)算以后,只有a.f是有效的,其他的憶被覆蓋了。體變量的某個(gè)成員,而不能直接使用共用體變量。共用體變量成員的表現(xiàn)形式與 結(jié)構(gòu)體相同,它們也使用訪問成員運(yùn)算符"."和"->"表示。例如,前面定義了 a,b,c為共用體類型變量,下面使用形式是正確的: a.i引用共用體變量中的整型變量 a.c引用共用體變量中的字符變量a,f引用共用體變量中的實(shí)型變量不能只引用共用體類型變量,如:cout<<a是錯(cuò)誤的,a的

9、存儲(chǔ)區(qū)域有好幾種類型,分別占用不同長(zhǎng)度的存儲(chǔ)區(qū),僅寫共用體類型變量名a難以使系統(tǒng)確定究竟輸出的是哪一個(gè)成等。員的值。應(yīng)該寫成cout<<a.i 或cout<<a.c在使用共用體類型變量的數(shù)據(jù)時(shí)要注意:在共用體類型變量中起作用的成員是最后一次存放a.i=1;a,c='a'a.f=1.3; 在完的成員,在存入一個(gè)新的成員后原胡的成員就失去了作用,如:此外,共用類型變量可以作為參共用體類型變量可以向另一個(gè)相同共用體類型的變量賦值。數(shù)傳遞給函數(shù),也可以使用地址傳遞方式把共用體類型變量的地址作為參數(shù)在函數(shù)間傳遞。在程序中經(jīng)常使用結(jié)構(gòu)體與共用體相互嵌套的形式。即共用

10、體類型的成員可是結(jié)構(gòu)體類型, 或結(jié)構(gòu)體類型的成員是共用體類型。例如,下列結(jié)構(gòu)何體類型datas的第三個(gè)成員是共用體類型: struct datas char*ps;int type;union float fdata;int idata;char cdata;udata;結(jié)構(gòu)體與共用體的大小A.結(jié)構(gòu)體與共用體、結(jié)構(gòu)體(struct )1.定義:結(jié)構(gòu)體是由一系列具有相同數(shù)據(jù)類型或不同數(shù)據(jù)類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合。2.例子:struct stude ntint num;char n ame20;;注意不要忽略最后的分號(hào)3.定義結(jié)構(gòu)體類型變量的方法:strcutstude nt stude nt1,

11、 stude nt2;4.大小:(1)空結(jié)構(gòu)體的大小為1byte.(2)結(jié)構(gòu)體的大小要是最嚴(yán)格,看下面詳細(xì)介紹。如:struct stude ntchar n ame;;占據(jù)的內(nèi)存空間為8個(gè)byte 。struct stude ntint num;char n ame;char mark;;大小也是8個(gè)Byte。按內(nèi)存對(duì)齊方式說,應(yīng)該是12個(gè)字節(jié),所以這里有些不明白。注意:結(jié)構(gòu)體變量可以有這樣的賦值:A=B;二、共用體(union )1.定義:union維護(hù)足夠的空間來放置多個(gè)數(shù)據(jù)成員中的“一種”,而不是為每一個(gè)數(shù)據(jù)成員配置空間,在union中所有的數(shù)據(jù)成員公用一個(gè)空間,同一時(shí)間只能存儲(chǔ)其中的

12、一個(gè)數(shù)據(jù)成員,所有的成員具有相同的起始地址。舉例:union dataint i;char ch;float f;大小為4個(gè)字節(jié)。a.i, a.ch .2.引用方式:不能引用共用體的變量,只能引用變量中的成員。如B.結(jié)構(gòu)體的大小運(yùn)算符sizeof可以計(jì)算出給定類型的大小,對(duì)于32位系統(tǒng)來說,sizeof(char) = 1; sizeof( int) = 4基本數(shù)據(jù)類型的大小很好計(jì)算,我們來看一下如何計(jì)算構(gòu)造數(shù)據(jù)類型的大小。C語(yǔ)言中的構(gòu)造數(shù)據(jù)類型有三種:數(shù)組、結(jié)構(gòu)體和共用體。數(shù)組是相同類型的元素的集合, 只要會(huì)計(jì)算單個(gè)元素的大小,整個(gè)數(shù)組所占空間等于基 礎(chǔ)元素大小乘上元素的個(gè)數(shù)。結(jié)構(gòu)體中的成員

13、可以是不同的數(shù)據(jù)類型,成員按照定義時(shí)的順序依次存儲(chǔ)在連續(xù)的內(nèi)存需要考慮到系統(tǒng)在空間。和數(shù)組不一樣的是,結(jié)構(gòu)體的大小不是所有成員大小簡(jiǎn)單的相加, 存儲(chǔ)結(jié)構(gòu)體變量時(shí)的地址 對(duì)齊問題??聪旅孢@樣的一個(gè)結(jié)構(gòu)體:struct stu1 int i;char c;int j;類型對(duì)齊方式(變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量)?Char偏移量必須為sizeof(char)即1的倍數(shù)?Short偏移量必須為sizeof(short)即2的倍數(shù)?i nt ?偏移量必須為sizeof(int)即4的倍數(shù)?float ?偏移量必須為sizeof(float)即4的倍數(shù)?double ?偏移量必須為siz

14、eof(double) 即8的倍數(shù)實(shí)際上,由于存儲(chǔ)變量時(shí)地址對(duì)齊的要求,編譯器在編譯程序時(shí)會(huì)遵循兩條原則:一、結(jié)構(gòu)體變量中成員的偏移量必須是成員大小的整數(shù)倍(0被認(rèn)為是任何數(shù)的整數(shù)倍)二、結(jié)構(gòu)體大小必須是所有成員大小的整數(shù)倍。對(duì)照第一條,上面的例子中前兩個(gè)成員的偏移量都滿足要求,但第三個(gè)成員的偏移量為5,并不是自身(int)大小的整數(shù)倍。編譯器在處理時(shí)會(huì)在第二個(gè)成員后面補(bǔ)上3個(gè)空字節(jié),使得第三個(gè)成員的偏移量變成對(duì)照第二條,結(jié)構(gòu)體大小等于最后一個(gè)成員的偏移量加上其大小,上面的例子中計(jì)算出來的大小為12,滿足要求。再看一個(gè)滿足第一條,不滿足第二條的情況struct stu2int k;2個(gè)字節(jié),使

15、得結(jié)構(gòu)體的不同的順序會(huì)影響到struct stu3struct stu4char c1;char c1;int i;char c2;char c2;int i;雖然結(jié)構(gòu)體 stu3和stu4中成員都一樣,但 sizeof(struct stu3)的值為12而sizeof(struct stu4)的值為8。short t;;成員k的偏移量為0 ;成員t的偏移量為4,都不需要調(diào)整。但計(jì)算出來的大小為6,顯然不是成員k大小的整數(shù)倍。因此,編譯器會(huì)在成員t后面補(bǔ)上 大小變成8從而滿足第二個(gè)要求。由此可見,大家在定義結(jié)構(gòu)體類型時(shí)需要考慮到字節(jié)對(duì)齊的情況, 結(jié)構(gòu)體的大小。對(duì)比下面兩種定義順序?只需把其展開即可。如果結(jié)構(gòu)體中的成員又是另外一種結(jié)構(gòu)體類型時(shí)應(yīng)該怎么計(jì)算呢 但有一點(diǎn)需要注意,展開后的結(jié)構(gòu)體的第一個(gè)成員的偏移量應(yīng)當(dāng)是被展開的結(jié)構(gòu)體中最大的 成員的整數(shù)倍??聪旅娴睦?struct temp+1short i;structchar c;+5int j;+6 ss;+10+2int k;+4;結(jié)構(gòu)體temp的成員ss.c的偏移量應(yīng)該是 4,而不是2。整個(gè)結(jié)構(gòu)體大小應(yīng)該是16。注意在linux下時(shí),整個(gè)結(jié)構(gòu)體的大小應(yīng)該是:=16char 對(duì)齊模數(shù)是 1,short 是 2 , int 是 4, float 是 4, double(

溫馨提示

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

評(píng)論

0/150

提交評(píng)論