题目
指针与引用在函数参数传递中的区别与应用
信息
- 类型:问答
- 难度:⭐⭐
考点
指针与引用的区别,函数参数传递,内存管理,const正确性
快速回答
关键要点:
- 指针是存储内存地址的变量,需要解引用操作符(
*)访问数据 - 引用是对象的别名,必须初始化且不可重新绑定
- 函数参数传递时:
- 指针传递需要检查空指针
- 引用传递更安全且语法简洁
- 优先使用
const引用避免意外修改 - 需要重新指向不同对象时使用指针
1. 核心原理说明
指针是存储内存地址的独立变量,具有以下特性:
- 可以指向不同对象(可重新赋值)
- 支持
nullptr表示空指针 - 需要解引用操作符(
*)访问目标数据
引用是已存在对象的别名:
- 必须在声明时初始化
- 不能重新绑定到其他对象
- 语法上直接操作目标对象(无需解引用)
2. 代码示例对比
// 指针版本
void modifyViaPointer(int* ptr) {
if (ptr != nullptr) { // 必须检查空指针
*ptr = 100; // 显式解引用
}
}
// 引用版本
void modifyViaReference(int& ref) {
ref = 200; // 隐式操作目标对象
}
int main() {
int value = 42;
// 指针调用需要取地址
modifyViaPointer(&value);
// 引用调用直接传递对象
modifyViaReference(value);
// 需要重新指向时只能使用指针
int a = 1, b = 2;
int* ptr = &a;
ptr = &b; // 合法:指针可重新指向
int& ref = a;
// ref = b; // 错误!这是赋值操作而非重新绑定
}3. 最佳实践
- 默认使用
const引用:void process(const std::string& str);
避免拷贝开销且防止意外修改 - 输出参数选择:
- 引用:必须修改且对象必然存在时
- 指针:可能需要空值或重新指向时
- 智能指针优先:资源管理场景使用
unique_ptr/shared_ptr替代裸指针
4. 常见错误
- 空指针问题:
void unsafe(int* p) { *p = 5; } // 崩溃如果p为nullptr - 悬空引用:
int& createRef() { int x; return x; } // x已销毁,引用无效! - 误解引用重绑定:
int a=1,b=2; int& r=a; r=b; // 实际是a=b=2,并非重绑定
5. 扩展知识
- 移动语义:C++11后,右值引用(
T&&)实现高效资源转移 - 引用折叠规则:模板编程中
T& &→T& - 函数指针vs函数引用:
void (*funcPtr)() = &foo; // 函数指针
void (&funcRef)() = foo; // 函数引用 - 性能考量:在64位系统中指针和引用通常占用8字节,传递效率相同