模块三 · 进阶与实战 / 第 14 课
14 · 结构体与 typedef
学习目标
- 会定义结构体并访问成员
- 会用 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;
}
本课过关
必做访问结构体成员用什么符号?
逐步解析
结构体变量本身是一块「打包内存」,访问成员用点号:s.name、s.age,把整体拆出某一格。若手里是结构体指针 p(p = &s),不能写 p.name(p 不是结构体,是指针),要写 p->name,它等价于 (*p).name。初学先熟点号;等你写「函数里修改外部结构体」时再大量用箭头。:: 是 C++ 作用域符,# 是预处理,都不是成员访问。
必做作业
- 定义 Book:书名、页数、价格,并赋值打印。
- 用 typedef 定义 Time {时,分,秒}。
- 什么时候该用结构体而不是三个独立变量?
- 定义 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。
学完去哪
下一课:预处理与多文件,代码开始像工程。