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

C語言結構體、共用體與 typedef 完全指南

     編輯:關於C語言

概述

C 語言提供三種用戶自定義類型機制:typedef 類型別名、struct 結構體、union 共用體。本文系統講解其語法、語義、內存佈局及最佳實踐。

1. typedef - 類型別名

語法

typedef 現有類型 新類型名;

示例

typedef int INTEGER;
typedef char* CHAR_PTR;
typedef struct { int x, y; } Point;

作用

  • 簡化複雜類型聲明(如函數指鈈、陣列指標)。
  • 增強可移植性:隱藏平台相關的底層類型細節。
  • 提高代碼可讀性:賦予語義化名稱。

注意

typedef 不創建新類型,僅是別名。INTEGER 與 int 完全等價。

2. 結構體 (struct)

定義與聲明

struct Tag {
    type1 member1;
    type2 member2;
    ...
};

嵌套結構體

struct Date { int year, month, day; };
struct Student {
    char name[20];
    struct Date birthday; // 嵌套
    float scores[4];
};

內存佈局與對齊

  • 成員按聲明順序依次排列。
  • 編譯器插入填充字節滿足對齊要求(如 int 通常 4 字節對齊)。
  • 整體結構體大小為最大對齊數的整數倍。
  • 可用 #pragma pack(n) 或屬性 __attribute__((packed)) 控制對齊。

靜態/動態分配

struct Student s1; // 棧上
struct Student *s2 = malloc(sizeof(struct Student)); // 堆上

3. 共用體 (union)

特點

  • 所有成員共享同一塊內存區域,大小等於最大成員大小。
  • 同一時刻只能存儲一個成員的值。
  • 常用於:類型轉換、節省內存、硬件寄存器映射。

示例:判斷大小端

union {
    int i;
    char c[4];
} u;
u.i = 0x01020304;
if (u.c[0] == 0x04) printf("Little-endian\n");

4. 綜合應用模式

帶標籤的聯合(Tagged Union)

enum Type { INT, FLOAT, STRING };
struct Value {
    enum Type tag;
    union {
        int i;
        float f;
        char *s;
    } data;
};

不透明指針

頭文件僅聲明 struct Impl;,實現細節隱藏在 .c 文件中,實現封裝。

5. 最佳實踐總結

  1. 優先使用 typedef struct { ... } Name; 定義自包含類型。
  2. 結構體成員按大小排序(大到小)可減少填充。
  3. 共用體僅在確定互斥訪問時使用,避免未定義行為。
  4. 對外接口使用不透明指針,隱藏實現細節。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved