結構體及位段

2021-09-30 16:21:46 字數 2382 閱讀 8227

一、結構體(struct):是由一系列相同型別或不同型別的資料構成的資料集合。

1.宣告乙個結構體的一般形式,如

struct student         //struct 結構體名

;

2.結構的定義

(1)先宣告結構體型別在定義結構體變數

如上面已定義了乙個結構體型別變數,然後定義結構體變數。如

struct student student1,student2;
(2)在宣告型別的同時定義結構體變數

struct student     

student1,student2;

3.結構體變數的初始化

(1)在定義時指定初始值。如

struct student     

student1 = ;

(2)也可以採取宣告型別與定義變數分開的形式

struct student student2 = ;
4.結構體的typedef

typedef 是c語言中的乙個關鍵字,是型別定義的意思,typedef struct 是為了使用結構體更方便。如

typedef struct student     

stu;

在定義結構體變數時,struct student student1相當於stu student1。

5.結構體的儲存

結構體在記憶體中的儲存的大小不是單純的把所有型別的位元組數相加,而是按記憶體對齊的方式來儲存的。

(1)對齊原因主要來自兩個方面

任意資料的;某些硬體平台只

能在某些位址處取某些特定型別的資料,否則丟擲資料異常。

b)效能原因:

資料結構(尤其是棧)應該盡可能的在自然邊界上對齊。原因在於,為了訪問未對齊的

記憶體,處理器需要作兩次內

存訪問;而對齊的記憶體訪問僅需

要一次訪問。

struct student     

;

若不存在記憶體對齊,則系統訪問結構體成員為乙個整型時,訪問int的變數內容需要作兩次訪問。

(2)對齊規則

①結構的第乙個成員永遠放在結構體的0偏移處。

②從第二個成員開始,都要對齊到 某個對齊數的整數倍處。對齊數為結構成員自身大小和 預設對齊數的最小值(每個編譯器都有自己的預設對齊數)。

③結構體的總大小必須是最大對齊數的整數倍。

④如果巢狀了結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數的整數倍。

☆程式設計師可以通過預編譯命令#pragma  pack(n)  n=1,2,4,8,16來改變對齊數。

計算結構體的記憶體大小,如

struct student  //vs預設對齊數為8

; //根據第三條規則,結構體的總大小是最大對齊數的整數倍,17個位元組不是最大對齊數的整數倍,所以浪費7個位元組

//最後大小為24個位元組
二、位段。

c語言允許在乙個結構體中以位元位為單位來指定其成員所佔記憶體長度,這種以位為單位的成員稱為位段,使用位段可以節省空間。

位段的宣告必須是int,signed int或unsigned int。在成員名的後面是乙個冒號和乙個整數。需要說明的是乙個位段必須儲存在

同一儲存單元中,

不能跨兩個單元。如果第乙個單元所剩空間不夠存放另一位位段時,應從下一單元存放該位段。

位段的長度不能

大於指定型別的長度,如int的位段的長度不能超過32。結構體中不能定義位段陣列。

1.結構體實現位段

struct student

;

2.位段大小的計算

乙個位段結構所佔的空間至少是乙個位段儲存單元的大小。若位段占得位數為0,則這個位段必須是無名位段,下乙個位段從下乙個位段

儲存單元開始存放。

3.位段的資料儲存及跨平台問題

位段為什麼不能跨平台呢?當乙個結構體宣告了兩個位段,第二個位段較大,無法容納在第乙個位段剩餘位時,編譯器有可能把第二個位段

儲存在記憶體的 下乙個位元組中,也有可能儲存在第乙個位段的後面,從而在兩個記憶體位置上形成重疊,還有位段在記憶體中是從前向後, 

還是從後向前是不同的,所以位段不能跨平台。(這個也是位段計算大小的方法,在vc操作環境下,第二個位段較大會儲存在下乙個位元組中,

位段是從後向前儲存的)

對結構體及位段的認識

在c語言裡為了描述一些現實生活中比較複雜的東西,往往需要用到結構體。結構體就是使用者自己建立的由不同資料型別組成的組合型資料結構。比如 描述乙個學生,可能需要描述他的學號,姓名,成績等。一.宣告及定義結構體變數 有三種方法定義結構體變數 1.先宣告結構體型別,再定義該型別的變數,例如 struct ...

結構體之位域(位段)

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾 個不同的區域,並說明每個區域的...

結構體之位域(位段)

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾 個不同的區域,並說明每個區域的...