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

C語言結構體(Struct)完整指南:定義、變量、成員訪問與內存佈局

     編輯:C 語言基礎

為什麼需要結構體?

數組只能存儲相同類型數據,但現實實體(如學生、產品、坐標)通常包含不同類型屬性:姓名、學號、年齡、成績等。結構體正是為了解決「異構數據聚合」而設計的用戶自定義復合類型。

結構體定義語法

struct 結構體名 {
    類型 成員名1;
    類型 成員名2;
    ...
};

經典示例:學生信息

struct Student {
    char *name;    // 姓名(字符串指針)
    int num;       // 學號
    int age;       // 年齡
    char group;    // 所在小組
    float score;   // 成績
};
  • Student 是結構體標籤(類型名)
  • 大括號內為成員列表,每個成員佔用獨立內存
  • 結尾分號不可省略,這是一條完整聲明語句
  • 成員不能在定義時初始化(只能聲明類型)

基本類型 vs 構造類型

結構體變量定義與使用

方式 1:先定義類型,再定義變量

struct Student stu1, stu2;  // 關鍵字 struct 不可省略

方式 2:定義類型同時定義變量

struct Student {
    char *name;
    int num;
    // ...
} stu1, stu2;  // 變量名放在結尾

方式 3:匿名結構體(僅用於定義少量變量)

struct {
    char *name;
    int num;
} stu1, stu2;  // 無標籤,後續無法復用類型

成員訪問:點運算符 (.)

結構體變量名.成員名

完整示例

#include <stdio.h>

int main() {
    struct {
        char *name;
        int num;
        int age;
        char group;
        float score;
    } stu1;
    
    // 逐個賦值
    stu1.name = "Tom";
    stu1.num = 12;
    stu1.age = 18;
    stu1.group = 'A';
    stu1.score = 136.5;
    
    // 讀取輸出
    printf("%s的學號是%d,年齡%d,在%c組,成績%.1f!\n",
           stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
    
    return 0;
}

運行結果

Tom的學號是12,年齡18,在A組,成績136.5!

整體賦值(僅定義時可用)

struct Student stu1, stu2 = {"Tom", 12, 18, 'A', 136.5};
  • 順序必須與成員聲明順序一致
  • 使用過程中只能逐個成員賦值,不能整體賦值(同數組)

內存佈局與對齊

理論連續佈局

成員按聲明順序連續排列。上例理論大小:

指針(4/8) + int(4) + int(4) + char(1) + float(4) = 17/21 字節

實際內存對齊(編譯器插入填充字節)

為提高 CPU 訪問效率,編譯器會按對齊規則插入填充字節:

  • 結構體起始地址對齊到最大成員對齊數
  • 每個成員偏移量對齊到自身類型大小(或編譯器指定對齊數)
  • 結構體總大小為最大對齊數的整數倍

上例在 32 位系統典型佈局:

name (指針 4B) : 偏移 0
num (int 4B)   : 偏移 4
age (int 4B)   : 偏移 8
group (char 1B): 偏移 12
【填充 3B】    : 偏移 13-15
score (float 4B): 偏移 16
總大小 = 20 字節(4 的倍數)
詳細對齊規則請參閱《C語言內存對齊,提高尋址效率》專題。

關鍵概念釐清

分類示例特點
基本類型int, float, char, double語言內置,不可拆分
構造類型結構體、聯合體、枚舉、數組由基本類型組合,可嵌套
概念說明
結構體類型模板/圖紙,不佔用內存
結構體變量實例/零件,佔用內存存儲實際數據
sizeof(結構體類型)等同於 sizeof(結構體變量),返回實例大小

進階用法預告

  • 結構體指針與 -> 運算符
  • 結構體數組、嵌套結構體
  • 結構體作為函數參數/返回值(傳值 vs 傳址)
  • 位域、柔性數組成員
  • typedef 簡化聲明
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved