结构体指针声明必须用struct_name*,初始化必须用&取地址;未初始化则为野指针,访问->成员前须确保有效;自引用需用指针避免无限递归,动态分配须配对delete。

结构体指针的声明和初始化必须带星号和取地址符
结构体指针不是结构体变量,它存的是地址,所以声明时必须用 struct_name* 语法,初始化时必须用 & 取结构体变量的地址。漏掉星号或取地址符,编译器会报错或行为异常。
-
Student* p;是合法声明;Student p;是变量,不是指针 -
p = &s1;正确;p = s1;错误(类型不匹配) - 未初始化的指针是野指针,
Student* p;后直接用p->name会崩溃 - 动态分配要配对释放:
Student* p = new Student;→ 必须delete p;
访问成员用 -> 还是 (*p).?优先选前者
-> 是专为结构体指针设计的操作符,语义清晰、不易出错;(*p).member 虽语法正确,但括号不能省——*p.member 实际等价于 *(p.member),会编译失败。
-
p->age安全简洁,推荐日常使用 -
(*p).age在模板或宏里偶尔有用,但手写代码没必要 - 如果结构体含数组成员(如
char name[20]),不能用p->name = "abc",这是赋值给地址常量,编译不过;得用strcpy(p->name, "abc")或std::string
结构体里存指针成员要特别注意生命周期
结构体本身可以包含指针成员(比如 char* desc),但这意味着该指针指向的内存不由结构体管理。如果指向栈上局部变量,函数返回后指针就悬空;如果指向堆内存,忘了 delete 就泄漏。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 避免:在函数内
char tmp[] = "hello"; s.desc = tmp;→ 返回后s.desc指向无效内存 - 安全做法:用
std::string替代裸指针;或明确分配堆内存并负责释放 - 若结构体需自引用(如链表节点),必须用指针:
struct Node { int val; Node* next; };—— 直接写Node next;会导致无限递归定义
结构体指针数组本质是“指针的数组”,不是“结构体的数组”
Student* arr[10]; 是长度为 10 的指针数组,每个元素都是 Student* 类型;而 Student arr[10]; 是 10 个结构体对象的数组。前者节省空间、支持动态绑定,后者连续布局、访问快。
- 初始化:先分配每个指针指向的对象,比如
arr[i] = new Student; - 遍历时用
arr[i]->name,不是arr[i].name - 释放:必须循环
delete arr[i];,否则只释放了指针数组本身,没释放背后对象 - 现代 C++ 更推荐
std::vector<:unique_ptr>></:unique_ptr>,自动管理生命周期
结构体里的指针容易被当成“只是语法糖”,但它牵扯到内存所有权、生存期和访问安全性三个层面。哪怕只是一个 -> 和 . 的选择,背后都对应着不同的内存模型假设。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










