C 语言书
模块三 · 进阶与实战 / 第 14 课

14 · 结构体与 typedef

进阶 35 分钟 跳到过关题
学习目标
  • 会定义结构体并访问成员
  • 会用 typedef 起短名
  • 能建模「学生 / 点」这类对象

把相关数据捆在一起

#include <stdio.h>
#include <string.h>

struct Student
{
    char name[20];
    int age;
    float score;
};

int main(void)
{
    struct Student s;
    strcpy(s.name, "Li");
    s.age = 18;
    s.score = 91.5f;

    printf("%s %d %.1f\n", s.name, s.age, s.score);
    return 0;
}

typedef 起短名

#include <stdio.h>

typedef struct
{
    int x;
    int y;
} Point;

int main(void)
{
    Point p;
    p.x = 3;
    p.y = 4;
    printf("(%d,%d)\n", p.x, p.y);
    return 0;
}

结构体数组

Point pts[3];
pts[0].x = 1; pts[0].y = 2;
/* 用循环批量处理即可 */

结构体当参数

可以把整个结构体传给函数(按值拷贝)。成员很多时也可传指针(更高效):

#include <stdio.h>

typedef struct
{
    char name[20];
    int age;
} Person;

void print_person(Person p)
{
    printf("%s, %d 岁\n", p.name, p.age);
}

int main(void)
{
    Person a = {"Amy", 20};  /* 按顺序初始化 */
    print_person(a);
    return 0;
}

小例子:学生成绩表

#include <stdio.h>

typedef struct
{
    char name[20];
    int score;
} Stu;

int main(void)
{
    Stu a[3] = {
        {"Ann", 90},
        {"Bob", 75},
        {"Cid", 88}
    };
    int i;

    for (i = 0; i < 3; i++)
    {
        printf("%s %d\n", a[i].name, a[i].score);
    }
    return 0;
}

本课过关

必做

访问结构体成员用什么符号?

必做作业
  1. 定义 Book:书名、页数、价格,并赋值打印。
  2. 用 typedef 定义 Time {时,分,秒}。
  3. 什么时候该用结构体而不是三个独立变量?
  4. 定义 3 个学生的数组,打印分数最高者姓名。
先自己写完,再点开看解答

1:Book

typedef struct {
    char title[40];
    int pages;
    double price;
} Book;

Book b;
strcpy(b.title, "C Primer");
b.pages = 700;
b.price = 88.5;

2:Time typedef struct { int h, m, s; } Time;

3:何时用结构体:当多个字段描述同一对象,且经常一起传参/存储时。若永远只是三个无关的独立量,不必强行打包。

4:最高分学生:遍历数组,维护 max 与 idx,最后打印 stu[idx].name。