- C 程式設計教程
- C - 首頁
- C 語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境搭建
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林值
- C 語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C 語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof 運算子
- C - 運算子優先順序
- C - 其他運算子
- C 語言中的決策
- C - 決策
- C - if 語句
- C - if...else 語句
- C - 巢狀 if 語句
- C - switch 語句
- C - 巢狀 switch 語句
- C 語言中的迴圈
- C - 迴圈
- C - while 迴圈
- C - for 迴圈
- C - do...while 迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break 語句
- C - continue 語句
- C - goto 語句
- C 語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C 語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C 語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 可變長陣列
- C 語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指標到指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void 指標
- C - 懸空指標
- C - 解引用指標
- C - 近、遠和巨型指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C 語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C 語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點 (.) 運算子
- C - 列舉 (或 enum)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C 語言中的檔案處理
- C - 輸入 & 輸出
- C - 檔案 I/O (檔案處理)
- C 預處理器
- C - 預處理器
- C - 指令
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C 語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static 關鍵字
- C - 隨機數生成
- C - 命令列引數
- C 程式設計資源
- C - 問答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C 語言中的聯合體
C 語言中的聯合體
在 C 語言中,聯合體是一種特殊的資料型別,它允許在同一個記憶體位置儲存不同的資料型別。您可以定義一個包含多個成員的聯合體,但在任何給定時間,只有一個成員可以包含值。聯合體提供了一種有效的方式,可以使用同一個記憶體位置來實現多種用途。
聯合體的所有成員共享同一個記憶體位置。因此,如果我們需要對兩個或多個成員使用同一個記憶體位置,那麼聯合體就是最適合的資料型別。最大的聯合體成員決定了聯合體的大小。
定義聯合體
聯合體變數的建立方式與結構體變數相同。關鍵字union用於在 C 語言中定義聯合體。
語法
以下是 C 語言中定義聯合體的語法:
union [union tag]{
member definition;
member definition;
...
member definition;
} [one or more union variables];
“聯合體標籤”是可選的,每個成員定義都是一個正常的變數定義,例如“int i;”、“float f;”或任何其他有效的變數定義。
在聯合體定義的末尾,在最後一個分號之前,您可以指定一個或多個聯合體變數。
訪問聯合體成員
要訪問聯合體的任何成員,我們使用成員訪問運算子(.)。成員訪問運算子被編碼為聯合體變數名和我們想要訪問的聯合體成員之間的句點。您將使用關鍵字 union 來定義聯合體型別的變數。
語法
以下是 C 語言中訪問聯合體成員的語法:
union_name.member_name;
聯合體成員的初始化
您可以透過使用賦值 (=) 運算子為其賦值來初始化聯合體的成員。
語法
以下是初始化聯合體成員的語法:
union_variable.member_name = value;
示例
以下程式碼語句顯示瞭如何初始化聯合體“data”的成員“i”:
data.i = 10;
聯合體的示例
示例 1
以下示例演示瞭如何在程式中使用聯合體:
#include <stdio.h>
#include <string.h>
union Data{
int i;
float f;
char str[20];
};
int main(){
union Data data;
data.i = 10;
data.f = 220.5;
strcpy(data.str, "C Programming");
printf("data.i: %d \n", data.i);
printf("data.f: %f \n", data.f);
printf("data.str: %s \n", data.str);
return 0;
}
輸出
當編譯並執行上述程式碼時,會產生以下結果:
data.i: 1917853763 data.f: 4122360580327794860452759994368.000000 data.str: C Programming
在這裡,我們可以看到i和f(聯合體的成員)的值顯示為垃圾值,因為分配給變數的最終值已佔據了記憶體位置,這就是str成員的值能夠正確列印的原因。
示例 2
現在讓我們再次看看同一個示例,在其中我們將一次使用一個變數,這是使用聯合體的主要目的:
#include <stdio.h>
#include <string.h>
union Data{
int i;
float f;
char str[20];
};
int main(){
union Data data;
data.i = 10;
printf("data.i: %d \n", data.i);
data.f = 220.5;
printf("data.f: %f \n", data.f);
strcpy(data.str, "C Programming");
printf("data.str: %s \n", data.str);
return 0;
}
輸出
當編譯並執行上述程式碼時,會產生以下結果:
data.i: 10 data.f: 220.500000 data.str: C Programming
在這裡,所有聯合體成員的值都能夠正確列印,因為每次只使用了一個成員。
聯合體的大小
聯合體的大小是其最大成員的大小。例如,如果一個聯合體包含兩個char和int型別的成員。在這種情況下,聯合體的大小將是int的大小,因為int是最大的成員。
您可以使用sizeof() 運算子來獲取聯合體的大小。
示例
在下面的示例中,我們列印了一個聯合體的大小:
#include <stdio.h>
// Define a union
union Data {
int a;
float b;
char c[20];
};
int main() {
union Data data;
// Printing the size of the each member of union
printf("Size of a: %lu bytes\n", sizeof(data.a));
printf("Size of b: %lu bytes\n", sizeof(data.b));
printf("Size of c: %lu bytes\n", sizeof(data.c));
// Printing the size of the union
printf("Size of union: %lu bytes\n", sizeof(data));
return 0;
}
輸出
當您編譯並執行程式碼時,它將產生以下輸出:
Size of a: 4 bytes Size of b: 4 bytes Size of c: 20 bytes Size of union: 20 bytes
結構體和聯合體的區別
在 C 程式設計中,結構體和聯合體都是複合資料型別。結構體和聯合體之間最顯著的區別在於它們儲存資料的方式。結構體將每個成員儲存在單獨的記憶體位置,而聯合體將所有成員儲存在同一個記憶體位置。
以下是一個名為myunion的聯合體型別的定義:
union myunion{
int a;
double b;
char c;
};
聯合體的定義類似於結構體的定義。具有相同元素的“struct type mystruct”的定義如下所示:
struct mystruct{
int a;
double b;
char c;
};
結構體和聯合體之間的主要區別在於變數的大小。編譯器為結構體變數分配記憶體,以便能夠儲存所有元素的值。在mystruct中,有三個元素:一個 int、一個 double 和一個 char,需要 13 個位元組 (4 + 8 + 1)。因此,sizeof(struct mystruct)返回 13。
另一方面,對於聯合體型別變數,編譯器分配一塊記憶體,其大小足以容納位元組大小最大的元素。myunion型別具有 int、double 和 char 元素。在這三個元素中,double 變數的大小最大,即 8。因此,sizeof(union myunion)返回 8。
另一個需要考慮的要點是,聯合體變數只能儲存其一個元素的值。當您為一個元素賦值時,其他元素未定義。如果您嘗試使用其他元素,則會導致一些垃圾資料。
示例 1:聯合體佔用的記憶體
在下面的程式碼中,我們定義了一個名為Data的聯合體型別,它具有三個成員i、f和str。Data型別的變數可以儲存一個整數、一個浮點數或一個字元字串。這意味著單個變數(即同一個記憶體位置)可以用來儲存多種型別的資料。您可以根據需要在聯合體中使用任何內建或使用者定義的資料型別。
聯合體佔用的記憶體將足夠大,以容納聯合體中最大的成員。例如,在上面的示例中,Data將佔用 20 個位元組的記憶體空間,因為這是字元字串可以佔用的最大空間。
以下示例顯示了上述聯合體佔用的總記憶體大小:
#include <stdio.h>
#include <string.h>
union Data{
int i;
float f;
char str[20];
};
int main(){
union Data data;
printf("Memory occupied by Union Data: %d \n", sizeof(data));
return 0;
}
輸出
當您編譯並執行程式碼時,它將產生以下輸出:
Memory occupied by Union Data: 20
示例 2:結構體佔用的記憶體
現在,讓我們建立一個具有相同元素的結構體,並檢查它在記憶體中佔用了多少空間。
#include <stdio.h>
#include <string.h>
struct Data{
int i;
float f;
char str[20];
};
int main(){
struct Data data;
printf("Memory occupied by Struct Data: %d \n", sizeof(data));
return 0;
}
輸出
此結構體將佔用 28 個位元組 (4 + 4 + 20)。執行程式碼並檢查其輸出:
Memory occupied by Struct Data: 28