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

C 語言結構體完整指南:定義、初始化、成員存取、指標操作與記憶體對齊

     編輯:關於C語言

C 語言結構體完整指南:定義、初始化、成員存取、指標操作與記憶體對齊

結構體(struct)是 C 語言實現使用者自訂型別的核心機制,允許將不同型別的資料封裝為單一邏輯單元。本文系統整理結構體宣告、變數定義、初始化、成員存取、指標操作、賦值規則與記憶體配置細節。

一、基本宣告與標籤

struct point {
    double x, y;
};
  • struct point 為型別名稱(標籤),等同於 int、double 等內建型別
  • 標籤命名規則同變數
  • 宣告結尾必須加分號

二、變數定義方式

1. 分離宣告與定義

struct point { double x, y; };
struct point p1, p2;  // 使用標籤定義變數

2. 合併宣告與定義

struct point {
    double x, y;
} p1, p2;  // 直接定義變數

3. 匿名結構(無標籤)

struct {
    double x, y;
} p1, p2;  // 僅能定義這兩個變數,無法後續復用型別

三、初始化

// 定義時初始化
struct point p = { 1.0, 2.0 };

// 指定初始化器(C99)
struct point p = { .y = 2.0, .x = 1.0 };

// 部分初始化:未指定成員自動歸零
struct point p = { .x = 1.0 };  // y = 0.0

四、成員存取

語法適用對象範例
.結構體變數p.x = 1.0;
->結構體指標ptr->x = 1.0;
struct point p = { 1.0, 2.0 };
struct point *ptr = &p;
printf("x = %f, y = %f\n", p.x, ptr->y);  // 等價

五、賦值規則

  • 定義時可用列表初始化:struct point p = {1.0, 2.0};
  • 定義後不可直接用列表賦值:p = {1.0, 2.0}; ❌ 編譯錯誤
  • 同型別結構體間可整體賦值(逐位元複製):
    struct point p1 = {1.0, 2.0};
    struct point p2 = p1;  // ✓
    p2 = p1;               // ✓

六、結構體指標與動態分配

struct point *ptr = malloc(sizeof(struct point));
ptr->x = 3.0;
ptr->y = 4.0;
free(ptr);

七、typedef 簡化型別名稱

typedef struct {
    double x, y;
} Point;  // 現在可直接用 Point

Point p1, p2;
Point *ptr = malloc(sizeof(Point));

八、巢狀結構與陣列

struct rectangle {
    struct point top_left;
    struct point bottom_right;
};

struct point points[10];  // 結構體陣列

九、記憶體對齊與大小

  • 編譯器為了存取效能,會在成員間插入填充位元組
  • sizeof(struct) 含填充,通常大於成員大小總和
  • 可用 #pragma pack(n) 改變對齊邊界(n=1,2,4,8,16)
  • 重新排序成員(大型別優先)可減少填充

範例:成員順序影響大小

// 12 位元組
struct A { char c1; short s; char c2; int i; };

// 8 位元組(優化後)
struct B { char c1; char c2; short s; int i; };

十、常見錯誤與最佳實務

  1. 忘記結構體宣告結尾的分號
  2. 混淆 . 與 -> 運算子
  3. 嘗試對已定義變數使用列表賦值
  4. 結構體指標未分配記憶體即解參考
  5. 跨編譯單元共用結構體定義時,應置於標頭檔
  6. 涉及網路/檔案傳輸時,注意位元組序與對齊差異

結構體是 C 語言建構複雜資料模型的基石。熟練掌握其宣告、初始化、記憶體佈局與指標操作,能讓你設計出清晰、高效且可維護的系統級程式碼。

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