在使用C或C++编写程序时,经常会遇到结构体和指针的组合操作。尤其是在处理链表、树这类数据结构时,箭头操作符(->)几乎无处不在。它看起来简单,但对初学者来说,容易和点操作符(.)混淆。
箭头操作符到底是什么
箭头操作符(->)用于通过指针访问结构体或类的成员。假设你有一个指向结构体的指针,就不能用点操作符直接访问其内部字段,而要用箭头。
比如定义一个表示学生信息的结构体:
struct Student {
char name[20];
int age;
float score;
};
然后声明一个指针指向这个结构体:
struct Student stu;
struct Student *p = &stu;
这时候想给学生的年龄赋值,就得这么写:
p->age = 18;
这行代码等价于 (*p).age = 18; 先解引用指针得到结构体本身,再用点操作符访问成员。箭头操作符就是把这两个动作合在一起,写起来更简洁。
实际场景中的常见用法
在做动态内存分配时,经常配合 malloc 使用。例如创建一个学生节点:
struct Student *newStu = (struct Student*)malloc(sizeof(struct Student));
if (newStu != NULL) {
strcpy(newStu->name, "张三");
newStu->age = 20;
newStu->score = 87.5;
}
如果不使用箭头操作符,就得写成 (*newStu).age 这样的形式,不仅难看,还容易出错,尤其当嵌套层级多的时候。
容易出错的地方
最常见的错误是指针未初始化就直接使用箭头操作。比如下面这段代码:
struct Student *p;
p->age = 25; // 危险!p 没有指向有效内存
这种写法会导致程序崩溃或者不可预测的行为。必须确保指针已经指向合法的内存地址,无论是栈上还是堆上。
另一个常见问题是混淆 . 和 -> 的使用场景。记住一条规则:如果变量本身是结构体类型,用点;如果是指针,用箭头。
struct Student s;
s.age = 19; // 正确:s 是结构体变量
struct Student *ptr = &s;
ptr->age = 20; // 正确:ptr 是指针
// ptr.age = 20; // 错误:不能对指针用点操作符