
- 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語言中的匿名結構體和聯合體
匿名結構體和聯合體的功能是在C11標準中引入的。其目的是增強C語言的靈活性和在某些情況下避免不必要的命名。
定義匿名結構體和聯合體的功能已被證明非常有用,尤其是在涉及建立複雜資料結構、硬體暫存器對映等的應用程式中。這使得程式碼更簡潔易讀。
匿名結構體
匿名結構體是一個結構體定義,沒有標籤或typedef。它通常巢狀在另一個結構體中。
匿名結構體的語法
以下是定義匿名結構體的語法:
struct type { elem1; elem2; struct { elem3; elem4; }; };
訪問匿名結構體的成員
匿名結構體/聯合體的成員可以直接訪問父結構體,簡化了表示法。
示例1
在下面的程式碼中,我們定義了一個名為employee的結構體。在其中,一個匿名結構體用於儲存員工的出生日期、月份和年份。在巢狀結構體的示例中,我們有一個內部的dob結構體。現在我們將使用匿名結構體。
#include <stdio.h> struct employee { char name[10]; float salary; struct { int d, m, y; }; }; int main(){ struct employee e1; strcpy (e1.name, "Kiran"); e1.salary=25000; e1.d = 12; e1.m = 5; e1.y = 1990; printf("Name: %s\n", e1.name); printf("Salary: %f\n", e1.salary); printf("Date of Birth: %d-%d-%d\n", e1.d, e1.m, e1.y); return 0; }
輸出
執行此程式碼後,將產生以下輸出:
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990
請注意,內部匿名結構體的“d”、“m”和“y”元素可以直接訪問。
示例2
以下示例中的外部結構體型別為student,它包含一個巢狀的匿名結構體來儲存課程的標題和ID。
#include <stdio.h> struct student { char name[10]; int age; struct { char coursettl[20]; int courseid; }; }; int main(){ struct student s1; strcpy (s1.name, "Kiran"); s1.age = 27; strcpy(s1.coursettl, "C Programming"); s1.courseid=1; printf("Name: %s\n", s1.name); printf("age: %d\n", s1.age); printf("Course Title: %s Course ID: %d\n", s1.coursettl, s1.courseid); return 0; }
輸出
執行此程式碼後,將產生以下輸出:
Name: Kiran age: 27 Course Title: C Programming Course ID: 1
匿名聯合體
匿名聯合體是一種特殊的聯合體,它沒有名稱。與普通聯合體不同,匿名聯合體主要用於建立未命名的成員,可以直接訪問而無需使用聯合體名稱限定它們。
匿名聯合體的語法
以下是定義匿名聯合體的語法:
struct type { elem1; elem2; union { elem3; elem4; }; };
訪問匿名聯合體的成員
匿名聯合體的成員可以直接訪問,無需使用聯合體名稱。
示例
匿名聯合體沒有名稱。這些元素共享相同的記憶體位置。
請看下面的例子:
#include <stdio.h> struct mystruct { int var; union { int var1; float var2; char var3; }; }; int main(){ struct mystruct data; data.var = 10; data.var2 = 5.55; printf("mystruct.var: %d\n", data.var); printf("anonymous union elements: %d %f %c", data.var1, data.var2, data.var3); return 0; }
輸出
執行程式碼並檢查其輸出:
mystruct.var: 10 anonymous union elements: 1085381018 5.550000 �
注意:與普通聯合體一樣,匿名聯合體變數的未初始化成員也會顯示垃圾值。
匿名結構體和聯合體的優點
主要優點之一是可以直接訪問成員,無需任何內部結構體或聯合體名稱。這可以使程式碼更易讀。以下是使用匿名結構體和聯合體的其他一些優點:
- 記憶體效率 - 與普通聯合體一樣,匿名聯合體允許不同資料型別共享相同的記憶體空間,從而產生更節省記憶體的程式碼,這在低記憶體環境中特別有用。
- 靈活性 - 匿名結構體提供了表示和訪問資料方式的靈活性,允許更動態和通用的資料結構。
- 便捷性 - 此功能允許對可以儲存不同資料型別的變數進行緊湊的表示。
- 易於初始化 - 它們可能更容易初始化和使用,因為它們不需要宣告聯合體變數。
請注意,在C11標準之前,匿名結構體或聯合體型別不是C標準的一部分。因此,如果目標系統使用符合早期標準的編譯器,則程式碼中的使用可能會導致相容性問題。
廣告