本人小白一枚 ,第一次寫blog,如有不對,請大家多指教!
好吧,那就開始吧。
tips_one:
文章中首先通過struct 和
union的結合使用
介紹了一下結構體的作用,這裡就不再重複描述,隨後給了一道intel、微軟等公司曾經出過一道類似的面試題:
1. #i nclude
2. #pragma pack(8)
4. ;
8. struct example2
9. ;
14. #pragma pack()
15. int main(int argc, char* argv)
16.
問程式的輸入結果是什麼?
對於我這個小白來說,不懂
#pragma pack()的作用,就只
能蒙了,結果一看,居然矇對了!
簡單介紹一下怎麼蒙這題的吧:
首先第乙個輸出其實就是問 struct example1 結構的 大小,那就是看怎麼對齊的啦,我印象裡知道結構體要按最大的size對齊,回頭一看
struct example1
;short 2位元組,long 4位元組,如果忽略
#pragma pack()的作用 那就是8位元組了,於是就蒙了個8,
同理呢,example2 中 char 1位元組, 所以還是按4位元組對齊 ,那就是16啦,
最後乙個輸出呢其實是問再struct example2中 char a 佔了幾個位元組,既然都是按4位元組對齊的 ,就算是char ,那也是要佔4位元組啦,就是4吧,
蒙完了一對比答案,哈哈 全對了 , 那#pragam pack()呢? 擺設?帶著這個問題,我繼續往下看,原來啊,這個#pragam pack(8)就是用來指定對齊位元組的(我說呢,怎麼會是擺設呢),引數8就是對齊位元組啦 ,但是呢,最大的是4個位元組的long,你這一來就8位元組,是不是浪費了,再一看,原來啊,要是這個引數大於最大位元組的話 ,就不起作用了(看來還是擺設),所以按我的做題思路,就蒙對了。
tips_two:
接著 文中介紹了c++中的struct 和 class的區別 :
例如,定義struct類和class類:
struct structa
class classb
則:structa a;
a.a = 'a'; //訪問public成員,合法
classb b;
b.a = 'a'; //訪問private成員,不合法
還有就是struct可以在定義的時候直接以對其成員變數賦初值,而class則不能,
例:struct structa
;structa a = ; // 定義時直接賦初值
tips_three:
看看下面的程式:
1. #i nclude
2. struct structa
3. ;
7.int main(int argc, char* argv)
8. 14行的輸出結果是:a
16行的輸出結果是:b
是不是很奇怪?為什麼明明是改變instant2 ,而instant1卻改變了!原來啊,關鍵是在13行,逐個拷貝成員變數時,instant2.cmember和instant1.cmember就變成了同一指標,也就是原文中說的訪問同於區域,這就導致了,改變
instant2
,而instant1卻改變了,收益匪淺啊!
tips_four:
最後一點,介紹了union (聯合體),
union 和 struct 的相同之處
聯合也是一種新的資料型別, 它是一種特殊形式的變數。
聯合說明和聯合變數定義與結構十分相似。其形式為:
union 聯合名 聯合變數名;
聯合表示幾個變數公用乙個記憶體位置, 在不同的時間儲存不同的資料型別和不同長度的變數。
下例表示說明乙個聯合a_bc:
union a_bc;
再用已說明的聯合可定義聯合變數。
例如用上面說明的聯合定義乙個名為lgc的聯合變數, 可寫成:
union a_bc lgc;
在聯合變數lgc中, 整型量i和字元mm公用同一記憶體位置。
當乙個聯合被說明時, 編譯程式自動地產生乙個變數, 其長度為聯合中最大的變數長度。
聯合訪問其成員的方法與結構相同。同樣聯合變數也可以定義成陣列或指標,但定義為指標時, 也要用"->;"符號, 此時聯合訪問成員可表示成:
聯合名->;成員名
另外, 聯合既可以出現在結構內, 它的成員也可以是結構。
例如:structx;
}y[10];
若要訪問結構變數y[1]中聯合x的成員i, 可以寫成:
y[1].x.i;
若要訪問結構變數y[2]中聯合x的字串指標ch的第乙個字元可寫成:
*y[2].x.ch;
若寫成"y[2].x.*ch;"是錯誤的。
union 和 struct 的不同之處,
結構和聯合都是由多個不同的資料型別成員組成, 但在任何同一時刻, 聯合轉只存放了乙個被選中的成員, 而結構的所有成員都存在,正是因為這樣,所以對於聯合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於結構的不同成員賦值是互不影響的。
比如下面這個例子:
main()
half;
}number;
number.i=0x4241;
printf("%c%c\n", number.half.first, number.half.second);
number.half.first='a';
number.half.second='b';
printf("%x\n", number.i);
getch();
}輸出結果為:
ab6261
當union訪問的是位元組half.first和half.second時,其實就是訪問 int i 的高低位元組,也就是0x42,0x41,所以輸出的是其ascll碼 a b
同理當union訪問的是int i 的時候 就會把
half.first和half.second當做是 i 的高低位元組,也就是0x61 0x61,所以輸出的i 就是0x6261
到此,本文也就告一段落了 希望大神們給予寶貴的指教,再次謝謝原文博主!
結構體學習筆記
什麼是結構體 1 不同型別的變數集合 2 結構體的目的是為了描述乙個物件,為了把乙個物件描述清楚,必須要說出這個物件的很多屬性,為了表示這些屬性,就要用到不同的變數,且變數不止乙個。工人 工號 姓名 性別 年齡 基本工資 如何來定義結構體 struct 結構體名 struct worker 定義乙個...
結構體學習筆記
以下記載了在初學結構體時犯下的一些錯誤。先來一些雜識 structf struct students void main basic knowledge 錯誤一 結構體內用本身定義實體 1 struct student 2 因為在結構體執行完之前,是沒有記憶體位址空間的。而第五行中定義了乙個實體,顯...
結構體和共用體學習筆記
為什麼需要結構體 傳統解決辦法 陣列是相同型別資料的集合。結構體可以存放不同型別的資料。結構體和結構體變數的區別和聯絡 1 結構體是自定義的資料型別,表示的是一種資料型別,2 結構體變數是乙個具體變數 int num1l int為資料型別,而num1是具體的int變數3 結構體變數在同一記憶體區域 ...