C語言 結構體相關

2021-03-31 08:57:01 字數 1769 閱讀 1550

結構體(struct)是c語言重應用比較多的一種資料結構,它可以有效的各種資料(包括各種不同型別的資料)整合

在乙個資料體中,可以更好的實現程式的結構化,更方便的管理資料及其對資料的操作。

在嵌入式系統開發中,一方面由於系統資源的嚴重不足,另一方面各種變數相互通訊,相互作用,正確合理使用結構體不僅可以為系統節約一部分寶貴的資源,而且還可以簡化程式的設計,使軟體設計的魯棒性和可維護性都大大增強。

以下程式都在windows 2000+visual c++ 6.0上除錯通過。

首先考察結構體的大小(size):

struct a

;如果按照各個資料的各自的大小進行累加,結構體a的size應該是:sizeof(char)+sizeof(int)=5;

而實際上,以上程式的執行結果為:the size of struct a is 8。

為什麼會出現這樣的情況?

這是因為在32位的作業系統上,作業系統組織資料是以32位(4個位元組)作為乙個標準,因此各種變數的size都

一般都是4的倍數。而且結構體資料都是按照定義時所使用的順序存放的,因此儘管code變數只會占有乙個位元組,但是code+student=5>4,因此第乙個4位位元組存放code,第二個4位位元組用於存放student,這樣實際上就浪

費了3個位元組。

有了上面的例子,後面的例子也就不難理解了:

struct b

;結構體b的size仍然是8,code+result共2個位元組,實際上佔據了4個位元組的容量,這樣就浪費了2個位元組。

以下結構體的浪費更為明顯:

struct c

;結構體c的size是12,這是因為sizeof(code)<4,但是sizeof(code+student)在4與8之間,因此實際上code佔

據了4個位元組,student佔據了4個位元組,同樣的道理result也將佔據4個位元組,sizeof(c)=12,這樣就總共浪

費了6個位元組的容量。

因此,對於潛入式系統和電子系統的設計來說,由於系統資源的不足,這方面的情況更需要格外的考慮,在

設計上更改以下資料定義的順序,有可能使得這樣的情況得到緩解。例如,結構體b和結構體c所定義的資料

實際上是相同的,因為定義的順序不同,結構體b所浪費的位元組數遠遠小於結構體c所浪費的位元組數。

位元域是一種由結構體擴充套件而來的資料結構組織形式,也稱為位域,佔位符等。類似下面的定義:

struct card

跟在變數宣告後面的非負正常數是該資料所佔據的位元寬度,位元寬度最多是機器字的長度,對於pc機和

windows作業系統而言,這個值是32。乙個32位的int型資料可以存放的資料範圍是極大的,在我們的程式中

往往並不需要這樣大的表示範圍,因此,使用位元域把資料壓縮到一定的表示範圍內,可以有效的節省程式

所需要的記憶體量,這在系統記憶體容量極為有限的嵌入式系統開發中是很重要的!

在上面的結構中,card變數擁有乙個4位元的域pips來存貯0--15的非負整數,乙個2位元的域suit來存貯

0--3以及乙個2位元的域kq。

實際上,上面定義中的int和char在很多情況下也是可以省略掉的,這樣在位元域中所定義的資料結構實際上

就與這些基本型別是無關的,只是表示一定區域的一些有符號整形數或者無符號整形數。因此,在宣告變數

的時候unsigned或者signed是必須註明的,因為編譯器需要確切的知道所定義的變數的精確取值範圍。

但是,應該注意的是:不同的編譯器對於位元域如何分配是有不同定義的,而且使用位元域組織的程式往往

可移植性不好,因此,除非是確實需要節省記憶體,否則位元域(包括聯合)最好不要使用。

C語言 結構體相關

1.結構體定義 structbooksbook books是定義了結構體型別tag,book是結構體變數。2.結構體的訪問 使用成員訪問運算子 例如book.title 3.typedef給結構體型別命名 typedef struct parkingsystem 這樣可以用parkingsystem...

C語言之結構體相關

結構體成員offset和size 結構體對齊 結構體成員比較 如何計算結構體成員在結構體中的偏移 s為結構體,m為結構體成員 結構體中包含結構體成員情況見下面的定義,example struct為結構體型別的成員 ifdef exfo undef exfo endif define exfo s,m...

c語言 結構體(及相關例題)

定義結構 為了定義結構,您必須使用 struct 語句。struct 語句定義了乙個包含多個成員的新的資料型別,struct 語句的格式如下 struct student stu student,是結構體標籤.stu結構變數,定義在結構的末尾,最後乙個分號之前,您可以指定乙個或多個結構變數.結構體變...