1、結構體
(1)結構體的宣告
結構體中的每個成員可以是不同型別的變數
例如:描述乙個學生
struct stu
;
(2)結構體的自引用
struct node
;
(3)結構體變數的定義和初始化
宣告型別的同時定義變數p1
struct point
p1;
初始化
struct point p2=;
(4)結構體內存對齊
計算機訪問記憶體的基本單位是位元組,計算機能任意讀取記憶體中的任何乙個位元組,計算機因為硬體設計的原因,讀取資料時必須從特定要求的位置開始讀取。
結構體內存對齊的本質:用空間換取時間
結構體的對齊規則:
1>第乙個成員在與結構體變數偏移為0的位址處
2>除了第乙個成員之外的其他成員變數對齊到某個數字(對齊數)的整數倍的位址處,即就是該變數的起始偏移量能夠整除當前變數的對齊數
3>結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍
4>如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍
舉例:
struct s1
;printf("%d\n", sizeof(struct s1));
分析:
(5)修改預設對齊數
#include#pragma pack(1)
struct s1
;
#pragma pack()設定對齊數
(6)結構體傳參
結構體傳參時,要傳結構體的位址
#include#includestruct s
;struct s s = , 1000 };
void print(struct s* ps)
int main()
2、位段位段的成員必須是int,unsigned int ,signed int 或 char型別
位段的成員名後邊有乙個冒號和乙個數字
位段的空間上是按照需要以4個位元組(int)或者1個位元組(char)的方式來開闢的
位段是不跨平台的
例如:
struct a
;
位段的大小是受平台影響的,位段的空間分配採用「壓縮儲存」方式,如果剩下的位元位數目能夠容納當前變數,大家就擠一擠;如果不能,則重新開闢
位段a的空間分配如圖所示:
位段a只開闢兩個整形空間,大小為8個位元組
執行結果如圖:
3、列舉
(1)列舉
列舉型別的本質是int
例子:
enum day
enum day是列舉型別,{}中的內容是列舉型別的可能取值,也叫列舉常量。這些 可能取值預設從0開始,一次遞增1,在定義時也可以賦初值。
例如:
(2)列舉與#define定義常量
列舉是一種型別,在編譯時會進行型別檢查;
巨集是基於替換原則,在這個過程中並不進行任何檢查工作
巨集的應用場景》列舉
4、聯合(共用體)
聯合也是一種特殊的自定義型別,這種型別定義的變數也包含一系列的成員,特徵是這些成員共用同一塊空間。
例如:
聯合體本身的大小並不是把所有的型別加起來的大小,常規而言,聯合體的大小是由聯合體內最大元素的大小覺得的,決定了之後,所有元素共享空間。
在使用union時,一次只會訪問乙個元素。
聯合體的宣告:
union un
;
聯合變數的定義:
union un un;
計算聯合變數的大小:
聯合體也要考慮記憶體對齊的問題,聯合體的最終大小要能整除聯合體內最大對齊數
自定義型別 結構體 位段 列舉 聯合
include include include 1 結構體 結構是一些值的集合,這些值稱為結構體成員,結構體的每個成員可以是不同型別的變數 struct stu 結構體的自引用 struct node 錯誤的,結構體內不能包含結構體自身 struct node 正確 指標是四個位元組 結構體內存對齊...
自定義型別 結構體 位段 列舉 聯合
1 結構體基礎知識 定義 不同或相同型別元素的集合 宣告 直接上例子會更清楚 成員 可以是變數 陣列 指標甚至其它結構體成員。struct stu 分號不能丟特殊宣告 匿名結構體型別,並不建議省略結構體型別名,知道有這麼回事就好了 struct x 注意 有n個結構體就有n種型別,即使兩個結構體成員...
自定義型別(結構體 位段 列舉和聯合)
結構體常用於資料的大體模板相同,但具體的內容不同。例如 學生的資訊都包括學號,姓名,年齡等資訊,但是每個學生的資訊的內容不同。這時就要用到結構體的建立。1.定義結構體變數 以學生資訊為例 struct stu student 也可以用struct stu student 來定義結構體變數。當然也可以...