C和指標 第10章 結構和聯合

2021-08-19 17:04:01 字數 1942 閱讀 6971

1.結構

struct x;

struct y[20], *z;

警告:以上兩個宣告被編譯器當做兩個截然不同的型別。即y和z為同一型別,但與x型別不用。

使用結構標籤宣告結構:

struct ******;
此時******是結構標籤,使用標籤建立需要如下**:

struct ****** x;

struct ****** y[20], *z;

使用typedef定義乙個新型別:

typedef struct ******;
此時******是乙個型別名,使用建立變數如下所示:

****** x;

****** y[20], *z;

1.5結構自引用

結構中不能包含型別為結構本身的成員,但可以包含乙個指向型別為結構本身的成員的指標。注意:

//錯誤

typedef struct ******;

//正確

struct ******;

同時使用結構標籤和typedef也是正確的宣告方式:

typedef struct ************;

3.結構的記憶體分配

編譯器按照成員列表的順序乙個接乙個的給每個成員分配記憶體,但要滿足正確的編劇對齊要求。一般而言:

struct simpl;
比下面宣告要占用更少的記憶體:

struct simpl;
sizeof操作符可以獲得乙個結構的整體長度,包括因邊界對齊而跳過的位元組。如果必須確定結構某個成員的實際位置,應該考慮邊界對齊因素,可以使用offsetof巨集(定義於stddef.h)。

offsetof( type, member );
type是結構型別,member是需要的成員名。

4.結構做函式引數。

為提示效率,對較大的結構體傳遞引數時採用指標會比傳遞值更優效率。擔心傳遞指標會導致函式修改結構體成員值可採用如下**:

void func( ****** const *******);
為提示效率還可以採用暫存器型別,即如下**:

void func( register ****** const *******);

5.位段

位段的宣告和結構體類似,但其的成員是乙個或多個位的字段。這些不同長度的字段實際儲存於乙個或多個整型變數中。

struct char ;
注意:

1.注重可移植性的程式應避免使用位段。

2.位段中位的最大數目。宣告於32位機的位段可能在16位的機器上無法執行。

3.位段中的成員在記憶體中是從左往右分配還是從右往左分配。

4.當乙個宣告指定了兩個位段,第2個位段比較大,無法容納於第1個位段剩餘位時,編譯器可能把第2個位段放在記憶體的下乙個字,也可能直接放在第1個位段後面,從而在兩個記憶體位置的邊界形成重疊。

6.聯合

聯合中的所有成員引用的是記憶體中的相同位置,所佔記憶體空間為成員中占用記憶體空間最大的成員所佔的記憶體空間。因此,若成員的占用記憶體空間大小差距懸殊,採用在聯合中儲存指向不同成員的指標而不是直接儲存成員本身的方法可以節省記憶體。聯合變數可以被初始化,但這個初始值必須是聯合第1個成員的型別,並且必須位於一對花括號內:

union  x = ;
結構和聯合的結合使用以節省記憶體:

struct variable  type;

union value;

};

C和指標第10章結構和聯合學習總結

下面圖中stmple是標籤 下面中 是乙個型別名 箭頭操作符 接受兩個引數,左運算元為乙個指向結構體的指標,右運算元為乙個結構成員。箭頭操作符會自動對左操數執行間接訪問取得指標所指向的結構,因此表示式 cp f和表示式cp f的結果是一樣的,cp f的結果是乙個結構。可以在乙個結構內部包含乙個指向該...

C和指標 第12章 使用結構和指標

2.單列表插入函式示例 include include typedef struct nodenode int sll insert register node rootp,int new value 以上 為最終修改和簡化後 修改和簡化有如下幾點 1.函式不能越過鍊錶尾部,所以採用判斷curren...

C和指標(7)結構和聯合

第10章 1 聚合資料型別能夠同時儲存超過乙個的單獨資料。c提供了兩種型別的聚合資料型別,陣列和結構。陣列是相同型別的元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的 因為陣列的元素長度相同 2 結構也是一些值得的集合,這些值稱為它的成員,但乙個結構的各個成員可能長度不同,故不能使用下標...