跳转至

结构体与指针(先不看)

指向结构体

指针也可以保存结构体变量的地址。

#include <iostream>
#include <string>

using namespace std;

struct stu {
    string name;
    int id;
    int chinese, math;
};

int main() {
    stu A = {"xiaoming", 1001, 90, 95};
    stu *p = &A;

    cout << p->name << ' ' << p->id;

    return 0;
}

A 是结构体变量,p 是指向 A 的指针。

img

点号与箭头

写法 含义
A.name 用结构体变量访问成员
p->name 用结构体指针访问成员
(*p).name 先解引用,再访问成员

p->name 与 (*p).name,这里访问的是同一个成员。

括号不能漏。 *p.name 不是 (*p).name,点号的优先级比解引用高。

通过指针修改成员

p->math = 100;
cout << A.math; // 输出100

修改的就是 p 指向的结构体,不是另外复制出来的一个学生。

结构体数组与指针

stu a[3] = {};
stu *p = a;

p->id = 1001;       // 修改a[0].id
(p + 1)->id = 1002; // 修改a[1].id

数组下标、指针移动、成员访问,可以组合使用。先用自己看得清楚的写法,不用刻意写复杂。

常见错误

指针没指向有效对象,就访问成员。

stu *p = nullptr; 只定义了空指针,没有创建学生对象,不能接着写 p->id = 1;。

把变量和指针的访问方式写混。

结构体变量用点号,结构体指针用箭头。判断时,先看 A、p 分别是什么类型。