一天乙個C 小知識

2021-10-07 22:22:48 字數 2200 閱讀 8469

1. struct、enum、union三個關鍵字在c中定義比較麻煩,所以一般和typedef一塊出現,而c++中則不用

2. struct和union中可以定義函式,但是:

2.1 struct和class用法完全相同,class有的功能它都用,唯一的區別在於當沒有指定成員的訪問許可權時,struct中預設為public而class預設為private

2.2 union也支援三種訪問許可權的設定,但是:

2.2.1 union不支援繼承

2.2.2 union不能定義虛函式

2.2.3 union和struct一樣,沒有指定訪問許可權時預設為public

2.2.4 union內的變數共享記憶體,所以不能用靜態、引用型別

2.2.5 union中不是所有類都可以作為其成員變數,如果乙個類(包括其父類)中還有自定義的constructor、copyconstructor、destructor、virtual functional或copy assignment operator(拷貝賦值運算子)任意乙個,則不能

2.2.6 union匿名聯合:定義union的時候不定以名字,僅僅通知編譯器它的成員變數公用乙個位址,並且變數本身直接引用,不使用「.」或者「->」,匿名聯合體的用處,能想到是類中定義節省空間,此外可能實現自動型別轉換,比如「union;int val;p=&val;」那麼此時直接輸出n就是乙個位址值,而不用再把p顯示轉為int型別。匿名聯合體有幾個特點:

2.2.6.1 不能定義static

2.2.6.2 不能定義函式

2.2.6.3 不支援protected和private

2.2.6.4 全域性域定義的匿名union只能是static否則必須放在匿名名字空間中。

3. struct 結構體

3.1 初始化:指定初始化a a=;;建構函式初始化。

3.2 直接訪問:struct a;a com;a.val=2;;間接訪問:struct a *p;p->a;(也可以(*p).a但是不簡潔)

3.3 自引用struct b;不合法,迴圈下去永遠不知道結構體的大小;struct b;合法,因為乙個指標所佔位元組數是已知的。

3.4 跑題:int val;cout<<&val;可以,但是char cval;cout<<&cval;不行,因為&cval是乙個char*變數,指向乙個字串,字串需要以終止符\0結尾,但&cval沒有,所以輸出亂碼。正確的方法是:1.printf(「%p」,&a);2.cout<<(void *)&cval;

4.2 union型資料所佔據的空間等於最大的成員所佔的空間,對union型成員的訪問都是相對於該聯合體基位址偏移量為0開始的,這樣通過union判斷當前系統模式。union a a;a.ch[0]=0x40;a.ch[1]=0x03;a.ch[2]=0x02;a.ch[3]=0x11;printf(「%x」,test.i);陣列中下標小的位址也低,記憶體內容依次為04、03、02、11一共四個位元組,而不分型別直接列印十六進製制,應該從記憶體高位址到低位址看,0x11020304,低位04在低位址上。

5.結構體的記憶體對齊。

5.1 struct aa;len1=sizeof(a)執行這一句**,len1值為16而不是1+4+8,這是因為結構體中元素是按照定義順序乙個乙個放到記憶體中的,但並不是緊密排列。從結構體的首位址開始,每乙個元素放置到記憶體中,它都會認為記憶體是以它自己的大小來劃分的,因此,元素放置的位置一定會在自己寬度的整數倍上開始。如果用||表示分隔,則十六個長度應該為|ch(char)佔乙個|null|null|null|ival(int)佔四個|dval(double)佔八個|。

5.2 strcut bb;len2=sizeof(b)執行這一**,按照上述規則,len2理應為8+8+4=20,但實際輸出24。這是因為,在經過上面的規則分析之後,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是的話結束,否則補齊它的整數倍。

5.3 這樣,我們在定義結構體時候,內部的元素應該按所佔位元組數從大到小排列,並且考慮補位的影響。

6. enum

6.1 預設以int型別儲存,佔四個位元組,可以儲存的最大值0xffffff。但是我們可以通過繼承的方式改變列舉的大小。c++中規定0<=sizeof(enum)<=sizeof(int),編譯器究竟是分配多少記憶體,emmmmm~

6.2 另外,enum testtest;test=e;cout<

想入門c語言?看這裡

c語言程式設計基礎

c語言 陣列和字串

c語言 指標專題一

c語言可控制led燈

一天乙個統計小知識 辛普森悖論

辛普森悖論是在說 在某個條件下的兩組資料,分別討論時都會滿足某種性質,可是一旦合併考慮,卻可能導致相反的結論。怎麼理解這句話呢?下面使用乙個小例子來進行具體宣告。例子 鵝廠為了比較英雄聯盟和王者榮耀這兩款遊戲哪個更受歡迎,分別抽取了1000個男生和1000個女生進行問卷調查,調查結果 假設英雄聯盟和...

一天乙個統計小知識 3 準則

今天來聊一下統計學中用於檢測異常值的 3 準則 什麼叫3 準則呢?其實它是用來粗略檢測異常值的一種方法,類似的還有 1 準則 和 2 準則 下面進行具體說明。在統計學中,如果乙個變數服從正態分佈,且它的均值是u uu,標準差是 那麼將有 1 68 的資料會落在 u uu 內,即資料分布在處於 u u...

一天乙個小頁面(1)

2 介面 3 首先要用css實現乙個愛心的話,我是用乙個正方形 兩個半圓畫出來的。然後用css3動畫的animation實現跳動效果。用css寫的話效率高。css的 body wrap left,right left right bottom left,right,bottom keyframes ...