Linux 結構體的詳細學習

2021-09-03 02:09:55 字數 2439 閱讀 2734

1.結構體的宣告

宣告的一般形式:

struct 結構體名

;struct stu

;stu 為結構體名,它包含了5個成員,分別是name、num、age、group、score。

2.定義結構體變數

struct stu s1,s2;

struct stu

s1,s2;

上面s1,s2是結構體變數。

3.結構體變數賦值與使用

struct stu stu1 =;

struct stu stu1 =;

struct stu

s1=;

訪問結構體成員變數是使用點號操作符.

stu1.name=「tom』;

stu1.num=12;

stu1.age=18;

stu1.group=『a』;

stu1.score=136.5;

4.結構體陣列

struct student stu[5]=,,,,};

5.結構體巢狀

struct a

;struct b

;6.結構體指標

6.1結構體和結構體變數是不同的概念。

6.2結構體是一種資料型別,和我們平時的 int,float等是一樣的,編譯器不會為他們分配記憶體。

6.3結構體變數才是實實在在的資料,才需要記憶體來儲存。

struct student stu =;//結構體變數

struct student psu=&stu;//結構體指標,指向乙個結構體變數stu

//struct student pstu =student;//錯誤的寫法;

獲取結構體成員:

// .號優先順序高於,(*psu)兩邊的括號是不能少的,如果去掉括號

//就變成了 psu.name=(psu.name)

printf(「name=%s\n」,(*psu).name);

//->是乙個新的運算子,一般叫做"箭頭」,通過她接過體指標能直接取得到結構體的成員

printf(「name=%s\n」,psu->name);

結構體變數名代表的是整個集合本身,作為函式引數時傳遞的是整個集合,也就是所有的成員,而不是像陣列那樣被編譯轉換成乙個指標。如果結構體成員較多,尤其是成員維陣列時,傳送的時間和空間開銷會很大,影響程式執行效率,所以最好的辦法就是使用結構指標,這時有實參傳向形參的只是乙個位址,非常快速。

7.結構體的位域

7.1位域的定義:

有些資料在儲存時並不需要占用乙個完整的位元組,只需要占用乙個或幾個二進位制位即可。例如開關只有通電和斷電兩種狀態,用 0 和 1 表示足以,也就是用乙個二進位。正是基於這種考慮,c語言又提供了一種叫做位域的資料結構。

在結構體定義時,我們可以指定某個成員變數所占用的二進位制位數(bit),這就是位域:

struct bs

;7.2位域的具體儲存規則

7.2.1相鄰成員的型別相同時

當相鄰成員的型別相同時,如果它們的位寬之和小於型別的 sizeof 大小,那麼後面的成員緊鄰前乙個成員儲存,直到不能容納為止;如果它們的位寬之和大於型別的 sizeof 大小,那麼後面的成員將從新的儲存單元開始,其偏移量為型別大小的整數倍。

struct bs

;printf("%d\n",sizeof(struct bs));

答案為4.

7.2.2相鄰成員型別不同時

當相鄰成員的型別不同時,不同的編譯器有不同的實現方案,gcc 會壓縮儲存,而 vc/vs 不會

struct bs

;printf("%d\n",sizeof(struct bs));

答案為4.

struct bs

;printf("%d\n",sizeof(struct bs));

答案為8.

這兩個就明顯的體現了gcc編譯器壓縮的特性。

7.2.3響鈴成員之間穿插著非位域成員時

如果成員之間穿插著非位域成員,會視情況進行壓縮。例如對於下面的 bs:

struct bs

;printf("%d\n",sizeof(struct bs));

答案為8.

struct bs

;printf("%d\n",sizeof(struct bs));

答案為4.

這兩個程式執行後的結果體現了gcc編譯器壓縮的特性.

7.2.4位域成員可以沒有名稱,只給出資料型別和位寬

位域成員可以沒有名稱,只給出資料型別和位寬

struct bs

;printf("%d\n",sizeof(struct bs));

無名位域一般用來作填充或者調整成員位置。因為沒有名稱,無名位域不能使用。

上面的例子中,如果沒有位寬為 20 的無名成員,m、n 將會挨著儲存,sizeof(struct bs) 的結果為 4;有了這 20 位作為填充,m、n 將分開儲存,sizeof(struct bs) 的結果為 8。

termios結構體的詳細設定

termios結構體內容 成員 描述 c cflag 控制模式標誌 c lflag 本地模式標誌 c iflag 輸入模式標誌 c oflag 輸出模式標誌 c line line discipline c cc nccs 控制字元 c ispeed 輸入波特率 c ospeed 輸出波特率在ter...

termios結構體的詳細設定

termios結構體內容 成員 描述c cflag 控制模式標誌 c lflag 本地模式標誌 c iflag 輸入模式標誌 c oflag 輸出模式標誌 c line line discipline c cc nccs 控制字元 c ispeed 輸入波特率 c ospeed 輸出波特率 在ter...

結構體的學習

結構體即結構變數。使用乙個結構體,應先宣告該結構的布局。類似於宣告變數 struct game以上 就宣告了乙個名為game的結構型別。於是我就可以在下面宣告乙個game型別的結構變數 struct game the witcher 3 在c 中struct可省略這時系統就會開闢一塊空間儲存該結構變...