不能直接传指针而要传指针的引用,因为c++默认值传递只修改形参副本,无法改变原指针变量的地址值;传指针引用(int*&)才能让函数修改原始指针本身,避免调用后仍为nullptr或访问非法内存。

为什么不能直接传指针,而要传指针的引用
C++里函数参数默认是值传递。如果你写 void alloc(int<em> p)</em>,然后在函数里做 p = new int[10],这只会改局部变量 p 的值,原调用处的指针根本不会变——它还是 nullptr 或旧地址。必须让函数能修改“指针变量本身”,也就是改变它的存储内容(即它存的那个地址),所以得传指针的引用:int& p。
常见错误现象:调用后打印指针仍是 nullptr,或访问时报 segmentation fault;根源就是没改到原始指针变量。
怎么声明和使用指针的引用参数
声明形式必须是 T<em>&</em>,其中 T 是数组元素类型。注意 & 属于引用声明符,不是取地址符,也不能写成 T&(语法错误)。
- 正确:
void alloc_array(int*& arr, size_t n) - 错误:
void alloc_array(int&* arr, size_t n)(非法类型) - 错误:
void alloc_array(int* arr, size_t n)(值传递,无效)
实操时,调用前指针应初始化为 nullptr(避免野指针),函数内用 new 分配并赋值给引用参数:
void alloc_array(int*& arr, size_t n) {
delete[] arr; // 安全起见,先释放旧内存(如果非空)
arr = new int[n]{}; // {} 初始化为零
}
容易踩的坑:内存泄漏、重复释放、类型不匹配
传指针引用只是解决了“改指针值”的问题,但不解决内存管理责任归属。以下几点极易出错:
- 忘记在调用前初始化指针为
nullptr,导致delete[]释放随机地址 - 函数内未检查
arr是否已指向有效内存,直接delete[] arr后又new,但若原内存是栈上变量(比如int x;被误传),就会 UB - 分配
int*却传入double*&类型引用,编译报错:cannot bind non-const lvalue reference of type 'double*&' to an rvalue of type 'int*' - 用
new int[n]分配,却用delete(而非delete[])释放,触发未定义行为
建议搭配 std::vector 使用,除非明确需要裸指针(如对接 C API 或性能关键路径)。
替代方案:返回新指针更清晰
如果只是想分配并返回,其实比引用更直白的是直接返回指针:
int* alloc_array(size_t n) {
return new int[n]{};
}
调用:int* arr = alloc_array(10);。语义明确,无引用绑定陷阱,也更容易配合智能指针(如 std::unique_ptr<int></int>)。
指针的引用真正必要,是在需要复用同一指针变量、且函数需根据条件决定是否重分配(比如 resize 场景),这时才体现出 int*& 的不可替代性——但务必确保调用方清楚自己承担了内存所有权。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











