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

C語言結構體入門(一):定義、聲明、成員訪問與初始化

     編輯:C 語言基礎

為什麼需要結構體

現實實體常包含異構數據:學生有姓名、學號、性別、成績。數組要求元素同類型,無法直接建模。結構體(struct)將不同類型、固定數量、有序的成員聚合為單一類型,相當於其他語言的 record/class(無方法)。

結構體定義語法


struct Tag {
    type1 member1;
    type2 member2;
    // ...
};
  • Tag:結構體標籤(可省略,匿名結構體)。
  • 成員類型可為基本類型、數組、指針、另一結構體(嵌套)。
  • 結尾分號 不可省。

示例:學生結構體


struct Student {
    int num;           // 學號
    char name[20];     // 姓名
    char sex;          // 性別
    float score;       // 成績
};

結構體變量聲明三種方式


// 1. 先定義後聲明
struct Student { ... };
struct Student stu1, stu2;

// 2. 定義同時聲明
struct Student { ... } stu1, stu2;

// 3. 匿名結構體直接聲明
struct { ... } stu1, stu2;  // 無標籤,無法在別處復用類型

宏定義別名(舊式)


#define STU struct Student
STU stu1, stu2;

成員訪問:. 與 ->

操作數運算符示例
結構體變量.stu1.num = 101;
結構體指針->pstu->num = 101;
  • p->member 等價 (*p).member,-> 優先級高於 *,無需括號。
  • 嵌套結構體逐級訪問:stu.birthday.month。

結構體賦值與初始化

整體賦值(同類型)


struct Student a = {101, "Zhang", 'M', 85.5};
struct Student b;
b = a;  // 逐成員拷貝,C 標準支持

初始化規則

  • 靜態/外部變量:可初始化,未顯式初始化的成員自動置 0/NULL。
  • 自動/局部變量:標準 C 禁止初始化(C99 允許),舊教材常見限制。現代編譯器 (GCC/MSVC) 支持局部初始化。
  • 初始化列表順序對應成員聲明順序,可用指定初始化器 (C99):.num=101, .name="Li"。

外部/靜態初始化示例


// 外部變量
struct Student stu1 = {101, "Zhang", 'M', 85.5};
struct Student stu2;
int main() { stu2 = stu1; ... }

// 靜態局部變量
void foo() {
    static struct Student stu = {102, "Wang", 'F', 90.0};
    ...
}

結構體數組


struct Student class[5] = {
    {101, "Li",   'M', 45.0},
    {102, "Zhang",'M', 62.5},
    {103, "He",   'F', 92.5},
    {104, "Cheng",'F', 87.0},
    {105, "Wang", 'M', 58.0}
};
// 訪問:class[i].score

示例:計算平均分與不及格人數


float sum = 0; int fail = 0;
for (int i=0; i<5; ++i) {
    sum += class[i].score;
    if (class[i].score < 60) ++fail;
}
printf("平均: %.2f, 不及格: %d\n", sum/5, fail);

通訊錄示例:結構體數組 + gets


#define NUM 3
struct Contact { char name[20]; char phone[11]; };

int main() {
    struct Contact list[NUM];
    for (int i=0; i

注意:gets 不安全(無長度限制),現代代碼請用 fgets(buf, sizeof(buf), stdin) 並去除換行符。

總結

  • 結構體聚合異構數據,定義需分號,聲明三種方式。
  • 成員訪問:變量用 .,指針用 ->。
  • 同類型結構體支持整體賦值(淺拷貝)。
  • 初始化:外部/靜態可初始化,局部視標準版本而定(C99+ 允許)。
  • 結構體數組建模同質實體集合(班級、員工表),遍歷用下標或指針。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved