C語言中的結構聯合(大端小端)

2021-08-21 04:49:09 字數 2134 閱讀 2376

結構和聯合是程式設計師自己定義的資料型別。

什麼是結構:是一種由程式設計師自定義的資料型別。

為了全面的描述乙個物體的各項資料,由不同資料型別組成的一種新的資料型別。

定義結構:

struct struct_name

; //分號不能少

注意:1.結構體變數定義時不能預設struct  格式為:struct struct_name struct_var1;

2.結構成員不能有初始值

3.結構當中不能有函式,但可以有函式指標

4.結構變數可以對結構變數直接賦值  struct_var1 = struct_var2;

當然,為了偷懶,可以使用重定義typedef搭配結構一起使用  

typedef struct name

name;

這樣就可以使用name 來定義結構體變數了  例如 name var1;

結構體的大小:

結構體的大小可以通過sizeof()檢視,但是結構體的大小不是簡單的成員型別的位元組數之和。

編譯器中提供了#pragma pack(n)來設定變數以n位元組對齊方式。n位元組對齊就是說變數存放的起始位址的偏移量有兩種情況:第

一、如果n大於等於該變數所占用的位元組數,那麼偏移量必須滿足預設的對齊方式,第

二、如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。

結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有成員變數型別所占用的位元組數,那麼結構的總大小必須為占用空間最大的成員變數型別的位元組數的倍數;否則必須為n的倍數。

簡單來說,就是遵循兩個規則:

對齊:每個結構體成員的起始相對位址(相對於整個結構體的起始位址)即偏移量是其自身型別和n兩者中較小值的整數倍,不夠則補上位元組數來對齊。第乙個成員變數的位址與整個結構體的起始位址相同。

補齊:結構體的大小是最大成員型別或n中較小值的整數倍。

舉個例子好了

#include int main(int argc, char const *argv)

stu;

printf("size=%d\n",sizeof(stu));

return 0;

}

執行結果是 32  

分析一下:name的偏移量為0,佔15位元組,當到age時,此時其偏移量為15,不滿足其本身型別int(4位元組)與n(4位元組)的最小值即4的整數倍,所以補上乙個位元組為16,佔4位元組,到***時,偏移量為20滿足本身型別char=1位元組整數倍,佔1位元組,之後由於grade的本身型別double = 8位元組》n=4位元組,所以選用4,偏移量為21要補上3位元組對齊,變數佔8位元組,最後總偏移量為32。總偏移量此時是最大成員數double和n中較小值4的整數倍,所以不用補齊。

當n改為2時,執行結果為30 ,道理同上。

幾個不同的資料型別共用同一段記憶體的結構,稱為聯合。

#include int main(int argc, char const *argv)

; union data data1;

printf("%d\n",sizeof(union data));

printf("%p\n%p\n%p\n",&data1.num,data1.s,&data1.p);

return 0;

}

執行結果為

大小為16,說明聯合也有補齊。聯合內的成員起始位址都是相同的,所以是天然對齊的。

說到聯合,還要提到乙個概念:大端小端系統。

對於資料來說比如0x1234 那麼12是高位資料,34是低位資料 對於位址來說0x0001 0x0002 前者是低位位址,後者是高位位址

可以通過聯合來判斷機器是大端還是小端。

#include union datadata1;

int main()

else if(0x12 == data1.num2)

return 0;

}

C語言 大端小端

大端小端的存在是為了解決計算機內位元組儲存排列問題,很多arm,dsp,以及x86系統採用的是小端模式,而keil c51採用的是大端模式,一般作業系統採用小端模式,而通訊協議是大端的。例如 0x1234 0x1234低位址 高位址小端 3412 大端12 34 includeint main in...

從大端小端,到聯合體與結構體

問題引出 計算機大端小端之爭。1 little endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。2 big endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。數字0x12345678 在大端小端的儲存方式 1 大端模式 低位址 高...

C語言中結構 聯合 列舉的說明

複雜的資料型別 一般的步驟 1 宣告模板 2 定義變數,分配記憶體空間 3 初始化 標記 識別符號 標籤 結構 設計程式很重要的一步是提高表示資料的能力,選擇表示資料的方法。c提供了結構變數 structure variable 提高你表示資料的能力。結構宣告 structure variable ...