结构体指针必须用->访问成员,因指针本身只存地址;arr[i]->age错误([]优先级高于->),应写(arr+i)->age或arr[i].age;const指针限制修改,智能指针同样支持->。

用 -> 操作符访问结构体指针的成员
结构体指针本身不包含数据,它只存地址,所以不能用 . 直接点成员。必须用 ->(箭头操作符),它是 (*ptr).member 的语法糖,编译器会自动解引用再取成员。
常见错误是写成 ptr.member,编译直接报错:error: request for member 'xxx' in 'ptr', which is of pointer type。
struct Person { int age; char name[20]; }; Person* p = new Person{25, "Alice"};- 正确访问:
p->age、p->name - 等价但冗余写法:
(*p).age—— 仅在需要强调解引用逻辑时才用
数组中结构体指针的成员访问要小心下标和优先级
当结构体指针指向数组(比如 Person* arr = new Person[10]),访问第 i 个元素的成员时,arr[i]->age 是错的:因为 [] 优先级高于 ->,这会被解析为 (arr[i])->age,而 arr[i] 是 Person 类型对象,不是指针,无法用 ->。
- 正确写法是:
(arr + i)->age或arr[i].age(此时用.) - 如果硬要用
->,必须确保左侧是“指向单个结构体的指针”,例如:Person* p = &arr[3]; p->age; - 混淆写法
arr[i]->age会触发编译错误:base operand of '->' has non-pointer type 'Person'
const 结构体指针访问成员有约束
声明为 const Person* p(指针可变,所指内容不可变)时,只能调用 const 成员函数,且不能修改任何非 mutable 成员;若声明为 Person* const p(指针不可变),则 p->age = 30 合法,但 p = nullptr 不合法。
-
const Person* p = &x; p->age = 20;→ 编译失败,age非mutable -
Person* const p = &x; p->age = 20;→ 合法 - 成员函数需显式标注
const才能被const指针调用,例如:int get_age() const { return age; }
智能指针(如 std::unique_ptr)同样用 ->
std::unique_ptr<person> p = std::make_unique<person>(42);</person></person> 这类智能指针重载了 operator->(),行为与原生指针一致,所以仍用 -> 访问成员,无需解引用或额外转换。
- 支持链式调用:
p->name[0] = 'B';、p->get_name().c_str();(假设get_name()返回std::string&) - 不要写
(*p).age—— 虽然语法上可行,但违背智能指针的设计意图,也降低可读性 - 注意空指针检查:
if (p) p->do_something();,否则运行时可能崩溃
C++里结构体指针访问成员这件事本身很直白,真正容易出问题的是混用数组下标、const 限定、以及把智能指针当成普通对象来操作。尤其是 arr[i]->xxx 这种写法,看着顺手,实际一编译就报错,而且错误信息不一定立刻指向根源。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











