c++指针声明必须指定指向类型,int与double不可混用;常见错误包括漏写、位置错误(如int p, q;中q非指针)、非法引用指针;须初始化为nullptr或有效地址,解引用前需确保非空且内存有效;const位置决定修饰指针或所指内容。

指针变量声明时必须指定指向类型
C++ 中指针不是万能容器,int* 和 double* 是完全不同的类型,不能混用。声明时漏写 * 或写错位置(比如写成 int *p; 与 int* p; 语义相同,但 int* p, q; 实际只让 p 是指针,q 是普通 int)是常见错误。
-
int* p;正确:声明一个指向int的指针 -
int* p, q;错误预期:实际等价于int* p; int q;,q不是指针 - 想同时声明多个指针,得写成
int* p, *q; - 引用类型不能直接用作指针目标类型,
int&*非法;但int*&(指向引用的指针)也非法——C++ 不允许指针指向引用
初始化为空或有效地址,避免野指针
未初始化的指针值是随机的,解引用会触发未定义行为,崩溃或静默错误都可能。编译器通常不报错,但运行时极危险。
- 推荐初始化为
nullptr:int* p = nullptr; - 也可初始化为变量地址:
int x = 42; int* p = &x; -
int* p = 0;或int* p = NULL;在旧代码中可见,但nullptr更类型安全 - 局部指针变量不初始化就使用,几乎必然出问题;静态/全局指针默认零初始化,但显式写
= nullptr更清晰
解引用前必须确认指针非空且所指内存有效
即使 p != nullptr,也不能保证 *p 安全——比如指向已 delete 的堆内存、栈上已退出作用域的变量、或只读内存区域。
- 函数返回局部变量地址是典型陷阱:
int* f() { int x = 1; return &x; }返回后x生命周期结束,指针立刻失效 - 动态分配后记得配对
delete,且delete后应置为nullptr防重复释放 - 用智能指针(如
std::unique_ptr)可大幅降低手动管理风险,但底层原理仍依赖原始指针规则
const 修饰符位置决定保护对象还是指针本身
const 放在 * 左右,语义完全不同,容易混淆。
-
const int* p;或int const* p;:指针可变,所指内容不可改(*p = 5;错误) -
int* const p = &x;:指针本身不可变(p = &y;错误),但*p可改 -
const int* const p = &x;:两者都不可变 - 读法建议从右往左:“
p是一个常量指针,指向常量int”
指针的灵活性直接来自其脆弱性——类型、生命周期、所有权三者任一出错,都会导致难以复现的问题。写的时候多花十秒检查 * 位置和初始化,比调试半小时段错误强得多。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











