關於結構體的學習筆記

2021-08-20 13:46:35 字數 3284 閱讀 1491

本人小白一枚 ,第一次寫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 結構體變數在同一記憶體區域 ...