結構體,位段,列舉,聯合

2021-09-24 23:39:51 字數 2391 閱讀 4957

結構體是一種可以將不同型別打包在一起的一種使用者自定義型別。

描述乙個學生

struct student stu;
這裡的定義及使用要遵循以下原則:

第乙個  **第二次定義變數時**時可採用以下形式進行二次定義

struct student a;

第二個    也可用以下形式定義

typedef struct student stu;
此時再次呼叫可採取這種形式定義,如:

stu a;

.**結構體的訪問**

結構體的訪問有兩種方法

stu.age=22;//將22賦值給stu中的age

stu->age=22;

**結構體的自引用**

結構體自己引用自己,比如:

struct student ;

這樣在訪問結構體內部成員的next時 ,可通過它來訪問到下乙個相同型別的結構體。

**結構的初始化**

結構體和陣列的初始化基本一樣,都可以用「」多個初化資料之間用「,」隔開。和陣列一樣可以被整體初始化但不能被整體賦值。比如

typedef struct student stu;

int main() ;

system("pause");

return 0;

}結構體中又有結構體時

typedef struct point point;

typedef struct node node;

int main() ** };

system("pause");

return 0;

}**結構體內存對齊**

在vs2017環境下sizeof(n1)大小為8和sizeof(n2)大小為12,比如:

typedef struct n1 n1;

typedef struct n2 n2;

只是定義變數的順序不一樣,為什麼大小不一樣,這裡就是記憶體對齊的問題了.

記憶體對齊的原因:

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

②**效能原因**:資料結構應該盡可能的在自然邊界對齊。原因在於為了訪問i對其的記憶體,總體來說:結構體的記憶體對齊是**拿空間換時間的做法。**

①第乙個成員在與結構體變數偏移量為0的地方。

②其他成員變數要對齊到某個數字(對齊數)的整數倍的位址。

③結構體的總大小為最大對齊數的整數倍。

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

.**如何修改對齊數**

#pragma pack(8)// 將對齊數設為8

而且只能是2的整數倍  **1,2,4,8,16**等

**結構體傳參**

結構體傳參時與陣列不同,編譯器會直接將拷貝到函式的臨時變數中。如果結構體裡面含有很大的陣列,那麼這個結構體會占用很大的空間,所以結構體傳參建議傳指標。

**2.聯合體**

聯合體定義:

聯合體成員是共用一塊記憶體空間的,這樣乙個聯合體變數大小,至少是最大成員大小。

定義方式

union un un;

特點1.所有內部成員共用一塊記憶體大小。因此我們在給un.a賦值以後,b的值也可能會發生改變。如:

union un un;

int main()

在這裡我們得到的un.b的值最終為1,雖然給un.b賦的初值為0,但是給un.a賦值時也將屬於兩個變數的共同記憶體賦值。

**位段**

位段的定義:

位段和結構體是類似的,有兩個不同

1.位段成員必須是**整形家族**int,unsigned int.

2.位段成員名後面必須有一**個冒號和乙個數字**。冒號後面的數字代表這個變數所佔的bit位大小。

3.它使用壓縮空間的做法,如果該位元組剩餘空間還能夠達到存放下乙個變數的大小,則將**下一變數存放至該位元組**。

如:struct a ;

a所佔空間大小為1+1(使c對齊)+2+4,為8.

**4.列舉**

列舉:顧名思義就是一一枚舉,把可能的值一一枚舉。比如現實生活中:乙個周有7天,,性別有:男女,一年12個月,這些都可以一一枚舉出。

列舉的定義:

enum week week1;

注意:第乙個 用week定義的結構體盡量只用其中的變數名賦值,否則就沒有意義。

第二個 其中變數的成員還是整形。

第三個   如果不指定每一句內的成員初值的話,會預設依次從0開始遞增,若只給中間某一成員賦初值,則所賦值成員之前的成員規則不變,之後的成員以被賦的的值依次遞增1。

結構體 位段 列舉 聯合小結

1.結構體型別建立 struct tag variable list 變數列表 其中,struct是定義結構體的關鍵字,tag是結構體標籤 1 定義型別的同時,定義變數 struct student stu 該例即定義了結構體型別student,同時定義了student結構體型別的結構體變數stu。...

掌握結構體 位段 列舉 聯合

1.結構體的宣告 struct tag tag是標籤 member list 成員列表 variable 是變數列表 2.結構體可以不完全宣告 也就是可以去掉tag 通過型別建立記憶體空間,例項化 3.結構體成員的訪問 結構體成員可以用符號 來訪問,例如 variable.member 有時我們用結...

自定義型別 結構體 位段 列舉 聯合

include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...