指针数组应声明为 int ptrs[n],而非 int ptrs[n];动态分配需用 new int[n],分配后须初始化各元素以防野指针。

用 int* 类型声明指针数组,别写成 int** 数组
常见错误是以为“存指针”就得用二级指针类型。实际上,要存 int*,数组元素类型就是 int*,不是 int**。比如:
int a = 10, b = 20, c = 30;<br>int* ptrs[3]; // 正确:ptrs 是长度为 3 的 int* 数组<br>ptrs[0] = &a;<br>ptrs[1] = &b;<br>ptrs[2] = &c;如果写成
int** ptrs[3],那存的是“指向 int* 的指针”,语义和用途都变了,多数场景不需要。动态分配指针数组时,new int*[N] 才对
想在堆上建 N 个可存 int* 的槽位,必须用 new int*[N]。容易错写成:
-
new int*[N]✅ —— 分配 N 个int*空间 -
new int**[N]❌ —— 分配 N 个int**,多了一级间接 -
new int[N]❌ —— 分配 N 个int,根本不是指针类型
<pre class="brush:php;toolbar:false;">int** ptrs = new int*[5];<br>for (int i = 0; i ptrs[i] = nullptr; // 或指向合法 int 对象<br>}
用 std::vector<:unique_ptr>></:unique_ptr>
更安全裸指针数组难管理生命周期,尤其涉及释放或异常路径。现代 C++ 推荐用智能指针容器:
- 存所有权:用
std::vector<:unique_ptr>></:unique_ptr>,自动析构 - 存观察者(不接管内存):用
std::vector<int></int>,但确保所指对象生命周期更长 - 避免
std::vector<:shared_ptr>></:shared_ptr>除非真需共享所有权——有性能开销
std::vector<:unique_ptr>> ptrs;<br>ptrs.push_back(std::make_unique<int>(42));<br>ptrs.push_back(std::make_unique<int>(100));<br>// 不用手动 delete,离开作用域自动清理</int></int></:unique_ptr>
访问时注意解引用顺序:先下标,再星号
对 int* arr[3],arr[i] 是一个 int*,所以取值要写 *arr[i],不是 arr[*i] 或 *arr[i] 写反括号位置。典型误写:
-
*arr[i]✅ —— 先取第 i 个指针,再解引用 -
arr[*i]❌ —— 把i当指针解引用,编译不过或崩溃 -
*(arr[i])等价于*arr[i],加括号只为了强调优先级
for (int i = 0; i if (ptrs[i] != nullptr) { // 必须检查!<br> std::cout }<br>}
C++ 里存指针本身不难,难的是谁负责释放、何时失效、是否为空——这些不会报编译错误,但会在运行时悄悄出事。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











