结构体成员访问
结构体成员通过点运算符 . 访问,结构体指针通过箭头运算符 -> 访问。理解这两种访问方式的区别和联系,是正确使用结构体的基础。
点运算符 .
struct Point {
int x;
int y;
};
struct Point p = {10, 20};
printf("x = %d, y = %d\n", p.x, p.y); /* x = 10, y = 20 */
p.x = 30; /* 修改成员 */
printf("x = %d\n", p.x); /* 30 */
箭头运算符 ->
struct Point p = {10, 20};
struct Point *ptr = &p;
printf("x = %d\n", ptr->x); /* 10 */
printf("x = %d\n", (*ptr).x); /* 等价 */
ptr->y = 30; /* 修改 */
ptr->x 等价于 (*ptr).x,箭头运算符是解引用和点运算的简写。
嵌套访问
struct Rectangle {
struct Point top_left;
struct Point bottom_right;
};
struct Rectangle r = {{0, 0}, {100, 100}};
printf("%d\n", r.top_left.x); /* 0 */
printf("%d\n", r.bottom_right.y); /* 100 */
struct Rectangle *rp = &r;
printf("%d\n", rp->top_left.x); /* 0 */
常见错误
对指针用点运算符:
struct Point *p = malloc(sizeof(struct Point));
p.x = 10; /* 错误:p 是指针 */
(*p).x = 10; /* 正确 */
p->x = 10; /* 正确 */
对结构体用箭头:
struct Point p;
p->x = 10; /* 错误:p 不是指针 */
p.x = 10; /* 正确 */
最佳实践
- 结构体变量用
.,结构体指针用-> - 嵌套访问从左到右读
- 复杂表达式用括号明确优先级
- 箭头运算符让指针访问更简洁