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

C語言結構體類型完整指南:定義三種形式、成員存取、初始化與巢狀結構

     編輯:關於C語言

為什麼需要結構體

簡單型態(整數、實數、字元)與陣列(同質元素集合)無法描述異質資料群組。
現實場景:住宿登記(姓名、性別、職業、年齡、身分證號)、成績單(班級、學號、姓名、多科分數)、通訊錄(姓名、部門、地址、郵遞區號、電話、Email)。
結構體:集中不同型態成員於一體,形成異質資料集合。

結構體類型定義語法


struct 結構體名 {
    成員列表
};

三種變數定義形式

形式 1:先定義類型,再定義變數(最常用、最靈活)


struct stu {              // 定義類型
    char name[20];
    char sex;
    long num;
    float score[3];
};
struct stu student1, student2;  // 定義變數
struct stu student3, student4;  // 同類型可繼續定義更多變數

形式 2:定義類型同時定義變數


struct data {
    int day, month, year;
} time1, time2;  // 同步定義變數
struct data time3, time4;  // 後續仍可用類型名定義更多

形式 3:直接定義無名結構體變數


struct {
    char name[20];
    char sex;
    long num;
    float score[3];
} person1, person2;  // 直接定義變數
// 缺點:無類型名,無法在其他處復用此結構定義

結構體成員存取:點運算子 .

語法:結構體變數.成員名


struct data { int day, month, year; } time1, time2;

time1.day = 15;
time1.month = 8;
time1.year = 2024;
// 等價於三個獨立 int 變數操作

每個結構體變數擁有獨立的成員副本,互不干擾。

結構體初始化

語法:定義時以大括號依成員順序提供初值。


struct stu {
    char name[20];
    char sex;
    long num;
    float score[3];
};
struct stu student = {"LiPing", 'F', 970541, 98.5, 97.4, 95};

結果:

  • student.name = "LiPing"
  • student.sex = 'F'
  • student.num = 970541
  • student.score[0] = 98.5, score[1] = 97.4, score[2] = 95
三種定義形式皆可在定義時初始化。

結構體成員輸入輸出

因成員型態不一,採字串輸入 + 型態轉換:


char temp[20];
gets(student.name);           // 姓名直接讀字串
student.sex = getchar();      // 性別讀單字元
gets(temp);
student.num = atol(temp);     // 學號字串轉長整數
for (i = 0; i < 3; i++) {
    gets(temp);
    student.score[i] = atof(temp);  // 分數字串轉浮點數
}

輸出:同樣需逐成員獨立輸出,不可整體輸出。

巢狀結構體

結構體成員可為另一結構體類型。


struct date {
    int day, month, year;
};
struct stu {
    char name[20];
    struct date birthday;  // 巢狀結構體成員
    long num;
};
struct stu person;

person.name = "John";
person.birthday.day = 15;
person.birthday.month = 8;
person.birthday.year = 2000;
person.num = 12345;

存取鏈:person.birthday.day — 逐層使用點運算子。

結構體記憶體佈局


// struct stu student = {"LiPing", 'F', 970541, 98.5, 97.4, 95};
// 記憶體連續儲存(含對齊填充):
[ L ][ i ][ P ][ i ][ n ][ g ][ \0 ][ ? ][ ? ][ ? ][ ? ][ ? ][ ? ][ ? ]  // name[20] 20 bytes
[ F ][ ? ][ ? ][ ? ]                                                    // sex + padding 4 bytes
[ 970541 (4 bytes) ]                                                    // long 4 bytes
[ 98.5 (4 bytes) ][ 97.4 (4 bytes) ][ 95.0 (4 bytes) ]                  // float[3] 12 bytes
// 總計約 40 bytes(視編譯器對齊策略)

結構體指標與箭頭運算子 ->


struct stu *p = &student;
p->name = "Wang";       // 等價於 (*p).name = "Wang"
p->score[0] = 90.0;

-> 專用於指標存取成員,. 用於變數本體。

結構體陣列應用


struct stu class[50];  // 50 位學生
class[0].name = "A";
class[1].score[2] = 88.5;
// 配合迴圈批次處理

位元欄位:節省空間的特殊成員


struct flags {
    unsigned int ready : 1;   // 1 bit
    unsigned int error : 1;
    unsigned int mode  : 2;   // 2 bits (0-3)
    unsigned int id    : 28;  // 剩餘 bits
};
// 總計 32 bits = 4 bytes,遠小於用獨立 int

適用於旗標、硬體暖存器映射、壓縮儲存。

關鍵總結

  1. 結構體 = 異質資料集合,解決陣列同質限制
  2. 三種定義形式:先型後變、同步定義、無名直接定義
  3. 成員存取:變數.成員、指標->成員
  4. 初始化:大括號依序賦值,三種形式皆支援
  5. 輸入輸出:逐成員處理,字串轉型函數
  6. 巢狀結構:成員可為結構體,存取鏈式點運算
  7. 整體指派合法(a = b),整體 I/O 非法
  8. 位元欄位優化空間,特定場景極致
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved