
- 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語言中的位域
當我們宣告一個結構體或聯合體型別時,結構體/聯合體型別變數的大小取決於其各個元素的大小。您可以設定位的大小來限制大小,而不是使用預設的記憶體大小。指定的大小稱為位域。
這是宣告位域的語法:
struct { data_type elem : width; };
假設您的 C 程式包含許多在名為status的結構體中分組的 TRUE/FALSE 變數,如下所示:
struct { unsigned int widthValidated; unsigned int heightValidated; } status;
此結構體需要 8 位元組的記憶體空間,但實際上,我們每個變數都只儲存“0”或“1”。C 語言提供了一種更好的方法來利用此類情況下的記憶體空間。
如果您在結構體中使用此類變數,則可以定義變數的寬度,這告訴 C 編譯器您只打算使用那麼多位元組。例如,上述結構體可以改寫如下:
struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status;
上述結構體需要 4 位元組的記憶體空間來儲存status變數,但只使用 2 位來儲存值。
示例
如果您最多使用 32 個變數,每個變數的寬度為 1 位,那麼status結構體也將使用 4 個位元組。但是,一旦您有 33 個變數,它將分配下一個記憶體槽,並將開始使用 8 個位元組。
讓我們檢查以下示例以瞭解這個概念:
#include <stdio.h> /* define simple structure */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* define a structure with bit fields */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main() { printf("Memory size occupied by status1: %d\n", sizeof(status1)); printf("Memory size occupied by status2: %d\n", sizeof(status2)); return 0; }
輸出
編譯並執行上述程式碼後,將產生以下輸出:
Memory size occupied by status1: 8 Memory size occupied by status2: 4
位域宣告
位域的宣告在結構體內部具有以下形式:
struct { type [member_name] : width ; };
下表描述了位域的變數元素:
元素 | 描述 |
---|---|
型別 | 一個整數型別,它決定如何解釋位域的值。 型別可以是int、signed int或unsigned int。 |
成員名稱 | 位域的名稱。 |
寬度 | 位域中的位數。“寬度”必須小於或等於指定型別的位寬。 |
使用預定義寬度定義的變數稱為位域。位域可以容納多個位;例如,如果您需要一個變數來儲存 0 到 7 的值,則可以定義一個寬度為 3 位的位域,如下所示:
struct { unsigned int age : 3; } Age;
上述結構體定義指示 C 編譯器變數“Age”將僅使用 3 位來儲存值。如果您嘗試使用超過 3 位,則它將不允許您這樣做。
示例
讓我們嘗試以下示例:
#include <stdio.h> struct { unsigned int age : 3; } Age; int main() { Age.age = 4; printf("Sizeof(Age): %d\n", sizeof(Age)); printf("Age.age: %d\n", Age.age); Age.age = 7; printf("Age.age : %d\n", Age.age); Age.age = 8; printf("Age.age : %d\n", Age.age); return 0; }
輸出
編譯上述程式碼時,將出現警告:
warning: unsigned conversion from 'int' to 'unsigned char:3' changes value from '8' to '0' [-Woverflow]|
執行時,將產生以下輸出:
Sizeof(Age): 4 Age.age: 4 Age.age: 7 Age.age: 0
您可以在儲存空間有限的情況下使用位域。當裝置傳輸編碼到多個位中的狀態或資訊時,位域也很有效。每當某些加密程式需要訪問位元組內的位時,都使用位域來定義資料結構。