對結構體及位段的認識

2021-08-03 15:26:23 字數 1767 閱讀 2942

在c語言裡為了描述一些現實生活中比較複雜的東西,往往需要用到結構體。結構體就是使用者自己建立的由不同資料型別組成的組合型資料結構。比如:描述乙個學生,可能需要描述他的學號,姓名,成績等。

一. 宣告及定義結構體變數

有三種方法定義結構體變數

1. 先宣告結構體型別,再定義該型別的變數,例如:

struct p

;int main()

2. 在宣告的同時定義,如下例:

struct p

p1,p2;

3.     不指定型別名直接定義結構體型別變數,這種方法用得不多

struct

p1,p2;

二. 結構體變數的初始化

用一對大括號括起來,例如:

struct stu

;int main()

};//用大括號初始化

printf("%s\n",s1.num);

printf("%s\n",s1.name);

return0;

}

三. typedef

在定義結構體變數時,我們需要struct stu s1,當**較長時,這樣的**會顯得繁瑣,可以使用typedef重新命名,例如:

typedef struct stu

stu;

intmain()

此時,將struct stu重新命名為stu,這樣寫既方便,又減少**長度。

四. 結構體在記憶體中儲存

先看一段**:

struct p

;int main()

它的結果是16,這是為什麼?

它遵循以下的記憶體對齊的原則

1.  結構體的第1個成員在結構體變數偏移量為0的位址處;

2.  從第2個成員開始,都要對齊到某個數字(對齊數)的整數倍數的位址處;

對齊數為結構成員自身大小和預設對齊數的較小值,

預設對齊數vs平台上是8個位元組,gcc為4個位元組

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

4.  如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是最大對齊數(含巢狀結構體的對齊數)的整數倍。

struct p

;struct p

;struct s

;

記憶體對齊的原因

2.  效能原因:資料結構(尤其是棧)應該盡可能的在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問,而對齊的記憶體訪問僅需要一次訪問。 

五. 位段

1、位段成員必須宣告為int,signed int,unsigned int型別,在成員名的後面是乙個冒號的乙個整數,這個整數該位段所占用的大小。

2、首先,位段的成員在記憶體裡面儲存是從左到右還是從右到左的是不確定的,其次,當乙個宣告指定兩個位段,第二個位段無法儲存在第乙個的剩餘位上時,第二個位段直接儲存於下乙個位元組上還是將第乙個位段剩餘的空間佔滿後剩下的儲存到下乙個位元組也是不確定的。

因此,位段不能跨平台使用。

structstu

;

在vs平台上,a和b儲存在乙個位元組上,c儲存在下乙個位元組上,所以該位段大小為2個位元組。

結構體及位段

一 結構體 struct 是由一系列相同型別或不同型別的資料構成的資料集合。1.宣告乙個結構體的一般形式,如 struct student struct 結構體名 2.結構的定義 1 先宣告結構體型別在定義結構體變數 如上面已定義了乙個結構體型別變數,然後定義結構體變數。如 struct stude...

結構體中的位段

在結構體中以二進位制為單位指定成大小的方式,稱為 位段或位域。有時資料的儲存用不了乙個或多個位元組,如表示真假時,只需要乙個位元位即可。本質還是為了節省空間 注意 位段不跨平台 1.位段的成員必須為unsigned 無符號 或int,char型別 2.位段的成員名後邊有乙個冒號和乙個數字 這個數字為...

結構體之位域(位段)

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