一、定義和用法
結構體(Struct)和聯合體(Union)是C語言中同屬於複合數據類型的一種類型,兩者都可以封裝多個不同類型的數據,但是卻有著顯著的不同之處。
1. 結構體的定義和用法
結構體是一種用戶定義的數據類型,它可以用來封裝多個不同類型的數據。通常情況下,結構體成員被設計為具有不同的數據類型。結構體通常被用來代表一個數據對象,例如汽車、學生、員工等等。C語言中結構體由多個成員組成,每個成員可以是不同類型的數據。
struct car {
char brand[20];
char model[20];
int year;
float price;
};
上述代碼定義了一個名為car的結構體,它包含四個成員,分別是char類型的brand和model、int類型的year和float類型的price。我們可以使用結構體來表示一輛汽車。
2. 聯合體的定義和用法
聯合體是一種特殊的結構體,它的所有成員共享同一段內存。聯合體的所有成員使用同一份內存空間,所以修改其中某一個成員的值,會影響到另一個成員的值。聯合體通常被用來節省內存,例如有一些數據只用到其中一個成員。
union data {
int integer;
float decimal;
};
上述代碼定義了一個名為data的聯合體,它包含了兩個成員,一個是int類型的integer,另一個是float類型的decimal,它們佔據同一段內存空間。我們可以使用聯合體來表示一個數據,可以是一個整數或者是一個浮點數。
二、內存布局
結構體和聯合體的內存布局也有著非常大的區別。
1. 結構體的內存布局
結構體的內存布局是將每個成員單獨分配內存,並依次排列。每個成員在內存中的地址都是連續的,各成員之間在內存中沒有任何關聯。
struct car {
char brand[20];
char model[20];
int year;
float price;
};
struct car mycar;
上述代碼定義了一個名為mycar的結構體變數。
內存圖:
0 20 40 44
+----------+----------------+----------+----------+
| brand | model | year | price |
+----------+----------------+----------+----------+
| |
mycar
在內存中,四個成員按照定義的順序被依次排列。用sizeof運算符可以計算結構體的大小(單位為位元組)。
printf("%zu", sizeof(mycar)); // 輸出:44
2. 聯合體的內存布局
聯合體的內存布局只分配聯合體中最大的成員所需要的內存空間,不管其他的成員的大小是多少。每個成員在內存中的地址都是相同的。
union data {
int integer;
float decimal;
};
union data mydata;
上述代碼定義了一個名為mydata的聯合體變數。
內存圖:
0-3 4-7
+-------+
|integer| 4 bytes
+-------+
OR
+-------+
|decimal| 4 bytes
+-------+
mydata
在內存中,union中僅分配了4個位元組的空間,不管是integer還是decimal都使用這4個位元組,因此,修改一個成員會影響到另外一個成員。
mydata.integer = 12;
printf("%d, %f", mydata.integer, mydata.decimal); // 輸出:12, 0.000000
mydata.decimal = 23.45;
printf("%d, %f", mydata.integer, mydata.decimal); // 輸出:1093507190, 23.450001
三、應用場景
1. 結構體的應用場景
結構體通常被用來封裝多個相關類型的數據,使得這些數據可以統一管理,方便使用。例如,用結構體來表示一個學生信息。
struct student {
char name[20];
int age;
char gender[6];
};
2. 聯合體的應用場景
聯合體通常被用來在一段內存空間中同時表示多個數據類型,這些數據類型在不同的時間和場合下只有一個會被使用。例如,用聯合體來表示數據類型轉換。
union data {
int integer;
float decimal;
};
void swap(union data *a, union data *b) {
union data temp = *a;
*a = *b;
*b = temp;
}
union data d1, d2;
d1.integer = 12345;
d2.decimal = 67.89;
swap(&d1, &d2);
printf("%d, %f", d1.integer, d2.decimal); // 輸出:1090873190, 12345.000000
四、小結
結構體和聯合體是C語言中的兩種複合數據類型,結構體將多個不同類型的成員按順序排列在一起,並分配不同的內存空間;聯合體將多個數據類型的成員共享同一段內存,以節省內存空間。兩者在應用場景上也有所不同,需要根據實際需求選擇使用。
原創文章,作者:STKNP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333929.html