(本篇根据AI回答修改整理。)
在 C 语言中,. 和 -> 都用于访问结构体中的成员,但它们的使用场景不同。
下面简单通俗地解释它们的区别与联系:
一 . (点运算符)
适用场景:用于直接访问结构体变量的成员。
前提条件:. 左侧必须是结构体变量,不是指针。
语法:
结构体变量.成员
示例:
struct Point {
int x;
int y;
};
struct Point p = {10, 20}; // 定义结构体变量 p
printf("%d\n", p.x); // 使用 `.` 访问 p 的 x 成员,输出 10
printf("%d\n", p.y); // 使用 `.` 访问 p 的 y 成员,输出 20
二 -> (箭头运算符)
适用场景:用于通过指针访问结构体变量的成员。
前提条件:-> 左侧必须是指向结构体的指针。
语法:
结构体指针->成员
示例:
struct Point {
int x;
int y;
};
struct Point p = {10, 20};
struct Point* ptr = &p; // 定义指向结构体的指针 ptr
printf("%d\n", ptr->x); // 使用 `->` 访问 ptr 所指向结构体的 x 成员,输出 10
printf("%d\n", ptr->y); // 使用 `->` 访问 ptr 所指向结构体的 y 成员,输出 20
三 . 和 -> 的区别
区别 | . | -> |
左侧对象 | 是结构体变量 | 是指向结构体的指针 |
适用场景 | 用于直接访问结构体的成员 | 用于通过指针访问结构体的成员 |
语法复杂度 | 简单 | 稍复杂,需间接访问结构体成员 |
四 . 和 -> 的联系
在本质上,-> 是对 * 和 . 的简化。你可以用 . 和解引用运算符 * 的组合来代替 ->,如下:
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).x); // 输出 10
注意:(*ptr).x 的括号不能省略,否则编译器会报错,因为 . 的优先级高于 *。
五 总结
如果你有一个结构体变量,使用 . 。
如果你有一个指向结构体的指针,使用 -> 。
-> 是 (*ptr).成员 的简化写法,更方便、更常用。