结构体与函数
结构体与函数的交互包括:结构体作为参数、结构体作为返回值、函数指针作为结构体成员等。理解这些交互方式,是设计模块化、面向对象风格 C 代码的基础。
结构体作为参数
struct Point {
int x;
int y;
};
/* 传值:复制整个结构体 */
void print_point(struct Point p)
{
printf("(%d, %d)\n", p.x, p.y);
}
/* 传指针:只复制地址 */
void move_point(struct Point *p, int dx, int dy)
{
p->x += dx;
p->y += dy;
}
struct Point pt = {10, 20};
print_point(pt); /* (10, 20) */
move_point(&pt, 5, 5); /* pt = {15, 25} */
结构体作为返回值
struct Point make_point(int x, int y)
{
struct Point p = {x, y};
return p; /* 返回结构体副本 */
}
struct Point p = make_point(10, 20);
函数指针成员
struct Calculator {
int (*add)(int, int);
int (*subtract)(int, int);
};
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
struct Calculator calc = {add, subtract};
printf("%d\n", calc.add(3, 5)); /* 8 */
常见错误
返回局部结构体指针:
struct Point *bad_func(void)
{
struct Point p = {10, 20};
return &p; /* 错误:返回局部变量地址 */
}
修改传值参数:
void try_move(struct Point p)
{
p.x += 10; /* 只修改副本 */
}
struct Point pt = {0, 0};
try_move(pt); /* pt 不变 */
最佳实践
- 小结构体传值,大结构体传指针
- 返回结构体值(现代编译器优化好)
- 函数指针成员实现多态行为
- 用 const 保护不修改的结构体参数