指针和引用的区别
在 C++ 中,指针和引用是最基础也最容易混淆的概念。面试时通常会从以下几个维度考察:
- 是否可变:指针所指向的内存地址在运行过程中可以改变,而引用一旦绑定到对象,就不能再指向其他对象。
- 是否可以为空:指针可以为空(nullptr),引用必须绑定一个有效的对象,不能为空引用。
- 是否支持多级:指针可以有二级、三级甚至更多级,引用只能是一级的。
- 是否可作为容器元素:vector 等容器可以存储指针,但不能直接存储引用。
- 是否支持算法运算:指针支持加减运算(如 p++),引用不支持算术运算。
野指针是什么?怎么导致的?怎么避免?
野指针是指向不确定、非法或已经失效内存的指针。使用野指针会导致未定义行为,甚至程序崩溃。
常见产生原因及示例:
-
指针未初始化
int* p; // 未初始化,p 的值是随机的垃圾值 *p = 10; // 危险操作 -
释放后继续使用
int* p = new int(10); delete p; *p = 20; // 访问已释放内存,野指针行为 -
函数返回局部变量地址 局部变量存储在栈上,函数结束栈帧销毁,内存失效。
int* foo() { int x = 10; return &x; // 返回局部变量地址 } int* p = foo(); cout << *p; // 输出不可预测 -
指针越界访问
int arr[5]; int* p = arr; p += 10; // 越界 *p = 20; // 非法访问
避免策略:始终初始化指针,使用后及时置为 nullptr,智能指针管理资源,避免手动 delete。


