首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言構造類型詳解:枚舉、結構體、聯合體與typedef

     編輯:關於C語言

C語言構造類型詳解:枚舉、結構體、聯合體與typedef

構造類型讓C語言能描述複雜數據結構。本文系統講解枚舉、結構體(聲明、初始化、成員訪問、傳參、數組、指針操作)、typedef 別名機制及聯合體內存共享特性。

一、枚舉類型 enum

枚舉本質是整型常量的別名,增強代碼可讀性。

enum COLOR {BLACK, RED, BLUE};        // 值為 0,1,2
enum COLOR {RED=1, YELLOW, BLUE};     // 值為 1,2,3
enum COLOR c = RED;

用途:替代 #define 或 const int 定義相關常量集合,具備類型檢查優勢。

二、結構體 struct

1. 三種聲明方式

// 方式1:先聲明類型,再定義變量
struct Point { int x; int y; };
struct Point p1;

// 方式2:匿名結構體,直接定義變量(無法復用類型)
struct { int x; int y; } p1, p2;

// 方式3:聲明類型同時定義變量
struct Point { int x; int y; } p1, p2;

2. 初始化與賦值


struct Point p1 = {10, 20};          // 順序初始化
struct Point p2 = {.y = 30};         // C99 指定成員初始化,其餘為0
struct Point p3 = p1;                // 整體賦值(淺拷貝)
p1.x = 5;                            // 成員訪問

3. 成員訪問操作符

  • .:結構體變量訪問成員(p1.x)
  • ->:結構體指針訪問成員(ptr->x 等價於 (*ptr).x)

4. 函數傳參:值傳遞 vs 指針傳遞


// 值傳遞:拷貝整個結構體,函數內修改不影響外部
void func_val(struct Point p) { p.x = 99; }

// 指針傳遞:傳遞地址,函數內可修改原值(推薦大結構體)
void func_ptr(struct Point *p) { p->x = 99; }

原則:大結構體傳指針避免拷貝開銷;需修改原值必須傳指針。

5. 結構體數組


struct Point points[3] = {{1,2}, {3,4}, {5,6}};
points[1].x = 10;

三、typedef 類型別名

為現有類型創建別名,簡化聲明,增強可移植性。


typedef int Length;           // 基礎類型別名
Length a, b;                  // 等價於 int a, b;

typedef struct {              // 匿名結構體 + typedef
    int x, y;
} Point;                      // 直接用 Point 當類型名
Point p = {1, 2};             // 無需寫 struct

慣例:結構體配合 typedef 使用,類型名大寫(Point),變量名小寫(p)。

四、聯合體 union

聯合體成員共用同一塊內存,大小等於最大成員的大小。


union Data {
    char c;     // 1字節
    int i;      // 4字節
    double d;   // 8字節 → 聯合體大小為8字節
};
union Data data;
data.i = 0x12345678;
data.c = 0x78;  // 修改了 data.i 的低位字節

核心特性

  • 同一時刻只能存儲一個成員的值。
  • 寫入一個成員,會覆蓋其他成員的內存位模式。
  • 常用於:類型雙關(如查看浮點數位模式)、節省內存(互斥字段)、硬件寄存器映射。

應用示例:拆分 int 為 4 個 char


union {
    int i;
    char bytes[4];
} converter;
converter.i = 0x12345678;
// converter.bytes[0] 為 0x78 (小端序)
// converter.bytes[3] 為 0x12

總結

類型關鍵字核心特性典型場景
枚舉enum整型常量別名,類型安全狀態碼、選項集合
結構體struct異構數據聚合,獨立內存實體建模、數據記錄
聯合體union同構內存共用,互斥存儲位操作、省內存、硬件映射
類型別名typedef簡化聲明,隱藏實現細節API設計、跨平台類型抽象

熟練掌握構造類型,是編寫模塊化、可維護C代碼的關鍵一步。尤其要理解結構體指針操作、typedef 的類型抽象能力、聯合體的內存覆蓋語義。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved