1.?struct、enum、union三個(gè)關(guān)鍵字在C中定義比較麻煩,所以一般和typedef一塊出現(xiàn),而C++中則不用
2.?struct和union中可以定義函數(shù),但是:
2.1? struct和class用法完全相同,class有的功能它都用,唯一的區(qū)別在于當(dāng)沒(méi)有指定成員的訪問(wèn)權(quán)限時(shí),struct中默認(rèn)為public而class默認(rèn)為private
2.2?union也支持三種訪問(wèn)權(quán)限的設(shè)置,但是:
2.2.1?union不支持繼承
2.2.2?union不能定義虛函數(shù)
2.2.3?union和struct一樣,沒(méi)有指定訪問(wèn)權(quán)限時(shí)默認(rèn)為public
2.2.4?union內(nèi)的變量共享內(nèi)存,所以不能用靜態(tài)、引用類型
2.2.5? union中不是所有類都可以作為其成員變量,如果一個(gè)類(包括其父類)中還有自定義的constructor、copyconstructor、destructor、virtual? functional或copy?assignment?operator(拷貝賦值運(yùn)算符)任意一個(gè),則不能
2.2.6? union匿名聯(lián)合:定義union的時(shí)候不定以名字,僅僅通知編譯器它的成員變量公用一個(gè)地址,并且變量本身直接引用,不使用“.”或者“->”,匿名聯(lián)合體的用處,能想到是類中定義節(jié)省空間,此外可能實(shí)現(xiàn)自動(dòng)類型轉(zhuǎn)換,比如“union{void? *p;int?n;};int?val;p=&val;”那么此時(shí)直接輸出n就是一個(gè)地址值,而不用再把p顯示轉(zhuǎn)為int類型。匿名聯(lián)合體有幾個(gè)特點(diǎn):
2.2.6.1?不能定義static
2.2.6.2?不能定義函數(shù)
2.2.6.3?不支持protected和private
2.2.6.4?全局域定義的匿名union只能是static否則必須放在匿名名字空間中。
3.?struct?結(jié)構(gòu)體
3.1?初始化:指定初始化A?a={val1=2,val2=1;};;構(gòu)造函數(shù)初始化。
3.2?直接訪問(wèn):struct?A{int?val;int?c[10];};A?com;A.val=2;;間接訪問(wèn):struct?A? *p;p->a;(也可以(*p).a但是不簡(jiǎn)潔)
3.3?自引用struct?B{int?val;struct?B?b;};不合法,循環(huán)下去永遠(yuǎn)不知道結(jié)構(gòu)體的大小;struct?B{int? val;struct?B?*b;};合法,因?yàn)橐粋€(gè)指針?biāo)甲止?jié)數(shù)是已知的。
3.4?跑題:int?val;cout<<&val;可以,但是char? cval;cout<<&cval;不行,因?yàn)?amp;cval是一個(gè)char*變量,指向一個(gè)字符串,字符串需要以終止符\0結(jié)尾,但&cval沒(méi)有,所以輸出亂碼。正確的方法是:1.printf(“%p”,&a);2.cout<<(void? *)&cval;
4.union即所有成員變量共用一個(gè)內(nèi)存首地址,聯(lián)合體的賦值涉及一個(gè)大小端的問(wèn)題:
4.1?大端模式:子數(shù)據(jù)的高字節(jié)存儲(chǔ)在低地址,低字節(jié)存儲(chǔ)在高地址
4.2? union型數(shù)據(jù)所占據(jù)的空間等于最大的成員所占的空間,對(duì)union型成員的存取都是相對(duì)于該聯(lián)合體基地址偏移量為0開(kāi)始的,這樣通過(guò)union判斷當(dāng)前系統(tǒng)模式。union? A{char?ch[4];int?I;}? a;a.ch[0]=0x40;a.ch[1]=0x03;a.ch[2]=0x02;a.ch[3]=0x11;printf(“%x”,test.i);數(shù)組中下標(biāo)小的地址也低,內(nèi)存內(nèi)容依次為04、03、02、11一共四個(gè)字節(jié),而不分類型直接打印十六進(jìn)制,應(yīng)該從內(nèi)存高地址到低地址看,0x11020304,低位04在低地址上。
5.結(jié)構(gòu)體的內(nèi)存對(duì)齊。
5.1?struct?A{char?ch;int?ival;double? dval;}a;len1=sizeof(a)執(zhí)行這一句代碼,len1值為16而不是1+4+8,這是因?yàn)榻Y(jié)構(gòu)體中元素是按照定義順序一個(gè)一個(gè)放到內(nèi)存中的,但并不是緊密排列。從結(jié)構(gòu)體的首地址開(kāi)始,每一個(gè)元素放置到內(nèi)存中,它都會(huì)認(rèn)為內(nèi)存是以它自己的大小來(lái)劃分的,因此,元素放置的位置一定會(huì)在自己寬度的整數(shù)倍上開(kāi)始。如果用||表示分隔,則十六個(gè)長(zhǎng)度應(yīng)該為|ch(char)占一個(gè)|NULL|NULL|NULL|ival(int)占四個(gè)|dval(double)占八個(gè)|。
5.2?strcut?B{char?ch;double?dval;int? ival;}b;len2=sizeof(b)執(zhí)行這一代碼,按照上述規(guī)則,len2理應(yīng)為8+8+4=20,但實(shí)際輸出24。這是因?yàn)?,在?jīng)過(guò)上面的規(guī)則分析之后,檢查計(jì)算出的存儲(chǔ)單元是否為所有元素中最寬的元素的長(zhǎng)度的整數(shù)倍,是的話結(jié)束,否則補(bǔ)齊它的整數(shù)倍。
5.3?這樣,我們?cè)诙x結(jié)構(gòu)體時(shí)候,內(nèi)部的元素應(yīng)該按所占字節(jié)數(shù)從大到小排列,并且考慮補(bǔ)位的影響。
6.?enum
6.1? 默認(rèn)以int類型存儲(chǔ),占四個(gè)字節(jié),可以存儲(chǔ)的最大值0xffffff。但是我們可以通過(guò)繼承的方式改變枚舉的大小。C++中規(guī)定0<=sizeof(enum)<=sizeof(int),編譯器究竟是分配多少內(nèi)存,emmmmm~
6.2?另外,enum? Test{a=1,b,c=5,d,e}test;test=e;cout<?
想入門C語(yǔ)言?看這里
C語(yǔ)言編程基礎(chǔ)
http://www.makeru.com.cn/live/1758_311.html?s=156461
C語(yǔ)言?數(shù)組和字符串
http://www.makeru.com.cn/video/2238_12037.html?s=156461
C語(yǔ)言?指針專題一
http://www.makeru.com.cn/video/2239_12043.html?s=156461
C語(yǔ)言可控制led燈