解析C語言結構體,位段。

2021-08-03 14:25:11 字數 2207 閱讀 5986



1.結構的定義

聚合資料型別能夠同時儲存超過乙個的單獨資料。c語言提供了兩種型別的聚合資料型別,陣列與結構。陣列是相同型別元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的。結構也是一些值的集合,這些值成為它的成員,但乙個結構的各個成員可能具有不同的型別。每個結構成員都有自己的名字,它們是通過名字訪問的。結構並不是乙個它自身成員的陣列。和陣列名不同,當乙個結構變數在表示式中使用時,它並不被替換成乙個指標。結構變數也無法使用下標來選擇特定的成員。

結構的宣告:

struct x;      我們可以看出這個宣告建立了乙個名叫x的變數,它包含三個成員:乙個整數,乙個字元,乙個浮點數。

2.結構的初始化

如下例子:

struct student

student1

這就是對結構的初始化。

3.結構體的typedef

關於結構體的typedef,

typedef是型別定義的意思。typedef struct 是為了使用這個結構體方便。

具體區別在於:

若struct node {}這樣來定義結構體的話。在申請node 的變數時,需要這樣寫,struct node n;

若用typedef,可以這樣寫,typedef struct node{}node; 。在申請變數時就可以這樣寫,node n;

區別就在於使用時,是否可以省去struct這個關鍵字。

1 首先:

在c中定義乙個結構體型別要用typedef:

typedef struct student

stu;

於是在宣告變數的時候就可:stu stu1;

如果沒有typedef就必須用struct student stu1;來宣告

這裡的stu實際上就是struct student的別名。

另外這裡也可以不寫student(於是也不能struct student stu1;了)

typedef struct

stu;

結構名是結構的識別符號不是變數名.

另一種常用格式為:

typedef struct 結構名

型別 變數名;

型別 變數名;

} 結構別名;

另外注意: 在c中,struct不能包含函式。在c++中,對struct進行了擴充套件,可以包含函式。

4.結構體的記憶體儲存(記憶體對齊規則,為什麼存在記憶體對齊?)

typedef struct fun

fun;

int main()

其值為24.

對齊過程分析(對齊引數為其他的同理):

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

2、從第二個成員開始,都要對齊到某個對齊數的整數倍處(對齊數為結構成員自身大小和預設對齊數的較小值    預設對齊數:vs--8,linux---4).

3、結構自身的總大小必須為最大對齊數的整數倍。

其值為32.

當聯合體中無陣列時,聯合體的大小為聯合體中變數型別最大的位元組長度;

當聯合體中有陣列時,聯合體的大小最小為位元組數最大的陣列,同時也要是位元組數最大的變數型別的最小整數倍。

5.結構實現位段,位段大小的計算。位段的資料儲存。

位段的宣告和普通的 成員宣告相同,但 是位段成員必須宣告為int 、signed  int、unsigned int型別。其次在成員名的後面是乙個冒號和乙個整數,這個整數表示該位段所占用的位的數目。

structbits;

這個位段定義中除了定義了各成員的位長以外,還有int型

在上例中,其中a、b、c共佔9位,占用了1個位元組還要多,不到2個位元組。而它後面為int型,占用2個位元組。則a、b、c之後的7個位的空間閒置不用,i從另乙個位元組開頭存放。如下圖所示:

3)儲存單元中位段的空間分配方向為由低位到高位分配。

上例中的字段分配圖只是乙個示意圖,在內在的實際表示其實是這樣的:

先定義的a(2個位),被分配到高16位的低位上,緊接著是b(3個位),後面的成員分配依此類推。最後的int型,因為是16位,高16位剩餘的7個位不能容納它,則i被分配到低16位。

6.位段的跨平台問題。 



解析C語言結構體,位段

1.結構體的定義 將不同型別的資料組合成乙個有機的整體,這些整合在乙個整體中的資料是互相聯絡的,它們組織成乙個組合項,在乙個組合項中包含若干個型別不同 也可以相同 的資料項,c語言 中允許使用者自己指定這樣一種資料型別,它稱為結構體。2.結構的初始化 結構的初始化與陣列的初始化很相似。乙個位於一對花...

C語言結構體,位段

1.結構的定義 在實際情況中,資料經常以成組的形式存在。如果這些值的型別各不相同,他們無法同時儲存於同乙個陣列中,在c中,可以使用結構把不同型別的值儲存在一起,所以結構也是一些值的集合,這些值稱為它的成員,但是這些成員的型別可以不同。拓展 結構 是一種構造資料型別,也叫做使用者自定義資料型別,它是由...

結構體 位段

在前面各章中,我們已經討論過位元組概念了。在大多數的計算機系統中,乙個位元組是由八個更小的,稱作為位的單位組成的。位是比位元組更小的單位。位只有兩個值,1 或 0 因此,儲存在計算機儲存器中的乙個位元組可以看成由八個二進位制數字形成的串。例如,乙個存放值 36 的位元組是八個二進位制數字的串 可以表...