<p>int p; 正确声明指针,星号属类型;p = &x; 获取地址,x 必须是左值;p 修改即修改 x;const int 需 const int*;解引用空指针或悬垂指针导致崩溃。</p>

怎么写一个 int 指针变量
直接用 int* 声明,后面跟变量名就行。别漏掉星号,它属于类型的一部分,不是修饰符。
-
int* p;是正确写法;int *p;也对(空格不影响),但int* p, q;会让人误以为q也是指针——其实只有p是,q是普通int - 声明时没初始化的指针是野指针,值随机,解引用必崩。宁可写成
int* p = nullptr; - 如果想同时定义多个指针,得每个都加星号:
int* p1 = nullptr, *p2 = nullptr;
怎么拿到 int 变量的地址
用取地址运算符 &,作用在已存在的 int 变量上。不能对字面量或表达式取地址(比如 &42 或 &(a + b) 是非法的)。
-
int x = 10; int* p = &x;—— 合法且常见 -
int* p = &10;—— 编译报错:lvalue required as unary '&' operand - 局部变量地址只在函数内有效;返回它的地址是危险行为,会导致悬垂指针
为什么 int* p = &x; 后 *p 改值会影响 x
因为 p 存的是 x 在内存里的起始位置,*p 就是按 int 类型去读写那块内存。本质是同一块内存被两个名字访问。
-
*p = 99;等价于x = 99;,改的是同一个存储单元 - 如果
x是const int x = 5;,那么int* p = &x;会编译失败(类型不匹配),必须用const int* p = &x; - 强行用
const_cast去掉 const 后再改,属于未定义行为,别试
常见崩溃场景和调试提示
绝大多数指针问题不是语法错,而是运行时踩内存。核心就两条:别解引用空指针,别解引用已释放/越界的地址。
立即学习“C++免费学习笔记(深入)”;
- 解引用
nullptr:Linux 下通常触发Segmentation fault (core dumped);Windows 可能弹“访问冲突” - 指向栈变量的指针在函数返回后还用:
int* f() { int x = 1; return &x; }—— 返回后x所在栈帧已被回收 - 用
malloc或new分配后忘了free/delete,不是立刻崩,但长期运行会内存泄漏 - GCC/Clang 加
-fsanitize=address能捕获多数越界和悬垂访问,开发期建议开着
指针本身不难,难的是时刻清楚它指向的内存归谁管、生命周期到哪一刻结束。这个意识比语法重要得多。










