C語言之結構體列舉聯合的理解

2021-08-19 22:25:50 字數 2367 閱讀 3469

一、結構體

結構體的定義:

結構體是c語言中一種可以自定義的資料型別。結構體就像名字一樣,是一些結構的集合。結構是一些值的聯合,結構的每個成員可以是不同型別的變數。

結構體的宣告:

有名字的結構體,建立乙個學生結構體:

struct stu

s;

struct stu

;

匿名結構體:
struct

arr;

匿名結構體的variable-list宣告的變數不能省略。

結構體的訪問:

如上面建立的學生結構體s可以通過s.age,s.name,s.***來訪問結構體的成員或使用結構體指標來訪問結構體如

s->age,s->name,s->***兩者是一樣的。

結構體的初始化:

上面的學生s結構體初始化

s=;列舉就如字面意思一一枚舉,現實中有許多事情是可以一一枚舉出來的,列舉變數應運而生。列舉是常量,在定義厚不可以再次進行賦值。

列舉的定義:

enum ***

;

列舉中的值也可以自定義:

enum ***

;

三、聯合聯合也是一種特殊的自定義型別,聯合變數也包含一系列成員,但這些成員是共用同一塊空間的,所以叫做聯合。

union

;

聯合的特點就是資料共用一塊空間,現在我沒來討論一下這幾種自定義資料型別的空間大小。

在這之前我們需要知道為什麼要記憶體對齊:

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

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

記憶體對齊的規則:

1、資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。

2、結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。

3、結合1、2可推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

win32平台下的微軟c編譯器

(cl.exe

for 80×86)的對齊策略:

1)結構體

變數的首位址是其最長基本型別成員的整數倍;

備註:編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找

記憶體位址

能是該基本資料型別的整倍的位置,作為結構體的首位址。將這個最寬的基本資料型別的大小作為上面介紹的對齊模數。

2)結構體每個成員相對於結構體首位址的

偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

備註:為結構體的乙個成員開闢空間之前,編譯器首先檢查預開闢空間的首位址相對於結構體首位址的偏移是否是本成員的整數倍,若是,則存放本成員,反之,則在本成員和上乙個成員之間填充一定的位元組,以達到整數倍的要求,也就是將預開闢空間的首位址後移幾個位元組。

3)結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要,編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。

在了解這些之後我們可以很容易算出這幾種自定義資料型別的大小了:

struct stu

s;

通過記憶體對齊規則我們可以算出這個結構體大小為32位元組。

union

;

這個聯合體的大小為4位元組。

位段:

struct s

所以是兩個位元組。

結構體,列舉,聯合

結構體 1.結構體的建立 1 在構建結構體之前,必須要對結構體進行宣告。例 struct student 描述乙個學生,student為標籤 此處的分號不能丟,此處也可寫變數 2 成員訪問 2.1在 1 中的 struct student 相當於型別,比如 int型,struct student s...

結構體 聯合 列舉

一般的,在宣告乙個結構提示要使用struct關鍵字,例如 建立乙個學生 struct stu char name 20 名字 int age 年齡 char 5 性別 char id 20 學號 分號不能丟結構體得特殊宣告 沒有結構體名 structx 沒有結構體的標籤,就不能在結構體建立完成之後再...

結構體,列舉,聯合。

今天我們來學習一下結構體,列舉以及聯合等知識。一。首先從結構體開始,結構體與陣列一樣都是聚合型別。1.結構體的宣告 struct tag variable list tag 1 可以省略 2 見名思意 3 盡量不省略。member list 不能為空。variable list 可以省略。例如 描述...