可以把結構體作為函式引數,傳參方式與其他型別的變數或指標類似。
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有 0 和 1 兩種狀態,用 1 位二進位即可。為了節省儲存空間,並使處理簡便,c 語言又提供了一種資料結構,稱為"位域"或"位段"。
所謂"位域"是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有乙個網域名稱,允許在程式中按網域名稱進行操作。這樣就可以把幾個不同的物件用乙個位元組的二進位制位域來表示。
典型的例項:
位域的定義與結構的定義相仿,如:
struct 位域結構名
;
其中位域列表的形式為:
型別說明符 位網域名稱 :位域長度
例如:
struct bsdata;
說明 data 為 bs 變數,共佔兩個位元組。其中位域 a 佔 8 位,位域 b 佔 2 位,位域 c 佔 6 位。
這樣子其實就是將記憶體的使用進行了精化,本來int 型的資料會分配給它的記憶體是8個位元組,但位域的作用就是將這8個位元組的內存在進行劃分,使每個物理記憶體都不被浪費掉。
讓我們再來看乙個例項:
struct packed_struct pack;
在這裡,packed_struct 包含了 6 個成員:四個 1 位的識別符號 f1…f4、乙個 4 位的 type 和乙個 8 位的 my_int。
struct bs
此處的位域設計就是將第一位元組的後四位空了出來,不予使用,也就是注釋中的空域的概念。
由於位域不允許跨兩個位元組,因此位域的長度不能大於乙個位元組的長度,也就是說不能超過8位二進位。如果最大長度大於計算機的整數字長,一些編譯器可能會允許域的記憶體重疊,另外一些編譯器可能會把大於乙個域的部分儲存在下乙個字中。如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮方式,dev-c++採取壓縮方式;具體的變現和編譯器的關係比較大。
同時位域中所說的不能夠跨越兩個位元組,是指位域中的元素不能出現跨越8位元組的現象,比如,位域中的int a 是佔了5個位置,那麼下乙個位域元素所佔的位元組數 就不能超過3。
位域可以是無名位域,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k;
所以說,位域在本質上就是一種結構型別,不過其成員是按二進位分配的。
位域既然是結構體下的東西,所以位域的使用和結構成員的使用相同,其一般形式為:
位域變數名.位網域名稱
位域變數名->位網域名稱
位域允許使用各種的格式輸出,整型,指標的形式都可以。
我這裡就說說 使用位域來優化記憶體,節省空間。關於其他的變數,暫存器之類的優化方法我會另外總結一篇。
位域優化記憶體的原理在上面其實說的差不多了,就是將物理記憶體的每乙個空間都利用起來,不要造成過多的浪費。
為了達到我所說的這種效果,我享的方法是:
首先是結構體在最初宣告的時候我們應該注意的東西,就是不同種類的變數會占用的記憶體大小,我們要注意結構體的記憶體對齊。
然後就是細微的去扣每個位元組位置,也就是位域的使用,合理的是由就可以節省記憶體,寫出優秀的**。
C語言之結構體(簡述 上)
c 陣列允許定義可儲存相同型別資料項的變數,結構是 c 程式設計中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。相比於陣列可以一次的儲存更多的不同的資料型別 為了定義結構,您必須使用 struct 語句。struct 語句定義了乙個包含多個成員的新的資料型別,struct 語句的...
C語言之結構體
一 什麼是結構體 結構體是不同型別的資料組合成乙個有機整體。例如 學生的學號 姓名 性別 成績 位址 這些都是乙個學生的屬性,把這些屬性組織成乙個組合,組合中包含不同的資料型別,c和c 允許指定這樣的資料型別,稱為結構體。struct student 申明乙個結構體型別 struct是結構體申明的關...
C語言之結構體
在c語言中,可以使用結構體 struct 來存放一組不同型別的資料。結構體的定義形式為 struct 結構體名 結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的成員 member 請看下面的乙個例子 struct stu stu 為結構...