结构体指针
结构体指针是操作结构体的重要方式,尤其在函数参数传递和动态内存分配中。通过指针访问结构体成员使用箭头运算符 ->,比传值更高效。
基本使用
struct Point {
int x;
int y;
};
struct Point p = {10, 20};
struct Point *ptr = &p;
printf("%d\n", ptr->x); /* 10 */
printf("%d\n", (*ptr).y); /* 20 */
动态分配
struct Point *p = malloc(sizeof(struct Point));
if (p != NULL) {
p->x = 10;
p->y = 20;
printf("%d, %d\n", p->x, p->y);
free(p);
}
函数参数
void move(struct Point *p, int dx, int dy)
{
p->x += dx;
p->y += dy;
}
struct Point pt = {0, 0};
move(&pt, 10, 20); /* pt = {10, 20} */
指针运算
struct Point arr[3] = {{0,0}, {1,1}, {2,2}};
struct Point *p = arr;
printf("%d\n", p->x); /* 0 */
p++; /* 移动到下一个结构体 */
printf("%d\n", p->x); /* 1 */
常见错误
未分配内存:
struct Point *p;
p->x = 10; /* 错误:p 未初始化 */
/* 正确 */
struct Point *p = malloc(sizeof(struct Point));
内存泄漏:
struct Point *p = malloc(sizeof(struct Point));
/* 使用 p */
/* 忘记 free(p) */
最佳实践
- 大结构体传指针,小结构体可传值
- 不修改的结构体指针用 const
- 动态分配后检查 NULL
- 释放后置 NULL