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

C 語言結構體與聯合體完整教學:定義、記憶體對齊、指標操作

     編輯:關於C

結構體:異質資料的容器

struct Stu {
    char *name;
    int num;
    int age;
    char group;
    float score;
};

三種宣告變數方式

  1. struct Stu s1, s2;
  2. 定義時同步宣告:} s1, s2;
  3. 匿名結構:struct { ... } s1, s2;(無法複用型別)

記憶體對齊與 sizeof 陷阱

編譯器遵循兩原則:

  1. 成員偏移量必為自身大小整數倍
  2. 結構體總大小必為所有成員大小整數倍

範例:

struct A { int i; char c; int j; }; // sizeof = 12 (非 9)
struct B { int k; short t; };       // sizeof = 8  (非 6)
struct C { char c1; int i; char c2; }; // sizeof = 12
struct D { char c1; char c2; int i; }; // sizeof = 8  ← 成員重排序省空間

巢狀結構體第一個成員偏移量需對齊到內層最大成員大小整數倍。

成員存取與初始化

struct Stu s = {"Tom", 101, 18, 'A', 92.5}; // 定義時整體初始化
s.age = 19;  // 後續只能逐一賦值
printf("%s %d\n", s.name, s.num);

結構體指標操作

struct Man { char name[20]; int age; };
struct Man m = {"Jack", 30};
struct Man *p = &m;

printf("%s %d\n", m.name, m.age);
printf("%s %d\n", (*p).name, (*p).age);
printf("%s %d\n", p->name, p->age); // 箭號最常用

聯合體:共享記憶體的多重視圖

union Data { int n; char ch; double f; };
union Data u;
u.n = 0x41424344; // u.ch = 'D' (小端模式低位元組)
printf("%zu\n", sizeof(u)); // 8 = max(sizeof(double))
  • 所有成員共用同一位址,寫入一個會覆蓋其他。
  • 大小 = 最大成員大小(含對齊)。
  • 常用於型別轉換、節省記憶體、硬體暇存器映射。

總結比較表

特性結構體聯合體
記憶體佈局成員依序排列,互不重疊成員完全重疊
大小計算含對齊填充,≥ 成員大小總和= 最大成員大小(對齊後)
同時有效成員全部僅一個
典型用途記錄、物件模擬型別雙關、省記憶體、協定解析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved