C語言結構體,位段

2021-08-03 14:04:35 字數 1705 閱讀 9996

1.結構的定義

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

拓展:

「結構」是一種構造資料型別,也叫做使用者自定義資料型別,它是由若干「成員」組成的。 每乙個成員可以是乙個基本資料型別或者又是乙個構造型別。 結構即是一種「構造」而成的資料型別, 那麼在說明和使用之前必須先定義它,也就是構造它。如同在說明和呼叫函式之前要先定義一樣。

2.結構的初始化

結構的初始化和陣列相似,位於一對花括號內,由逗號分隔初始值,可用於結構各個成員的初始化。這些值將根據結構成員的順序寫出,如果初始值不夠,剩餘的結構成員將使用預設值進行初始化。

struct s

s=, "abc"

};

typedef:

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

typedef

struct student

stu;

當需要宣告變數時,就可以直接stu.stu1;如果沒有typedef則需用 struct student stu1 來宣告;(stu==struct student);

4.結構體的記憶體儲存

結構在記憶體中的儲存是按照成員列表順序乙個接乙個的給每個成員分配記憶體。而在分配的時候則遵循結構體內存對齊規則:

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

(2).其他成員變數要對齊到對齊數的整數倍的位址處;

對齊數:編譯器的預設對齊數與該成員大小的較小值;

(預設對齊數 vs:8,linux:4)

(3).結構體的總大小為最大對齊數的整數倍。

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

struct s

;//則此結構體大小為16

stuct a

;struct s

;//結構體s的大小為32

記憶體對齊的原因:

(1).平台原因:不是所有的硬體平台都能訪問任意位址上的任意資料;某些硬體平台只能在某些位址處取某些特定型別的資料,否則將丟擲硬體異常。

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

5.結構體位段

位段的宣告和結構類似,但位段的成員是乙個或多個位的字段。位段成員必須宣告位int,unsigned int或signed int型別。在成員的後面是乙個冒號和乙個整數,這個整數就是該位段所占用的位的大小。

struct s

;

位段的資料儲存:

當乙個宣告指定了2個位段,第二個位段無法放在第乙個位段剩餘的位上,編譯器有可能把第二個位段放在記憶體的下乙個位元組上,也可能直接放在第乙個位段後面。

位段的大小:

位段的大小取決於編輯器對位段的資料儲存:

struct s

;//s的大小為4

struct s

;//s的大小同樣為4,因為a b c在建立後並未完全占用4個位元組

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

1.結構的定義 聚合資料型別能夠同時儲存超過乙個的單獨資料。c語言提供了兩種型別的聚合資料型別,陣列與結構。陣列是相同型別元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的。結構也是一些值的集合,這些值成為它的成員,但乙個結構的各個成員可能具有不同的型別。每個結構成員都有自己的名字,它們是...

解析C語言結構體,位段

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

結構體 位段

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