为什么对C初学者来说,理解指针与引用的区别至关重要?

2026-05-06 19:110阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1188个文字,预计阅读时间需要5分钟。

为什么对C初学者来说,理解指针与引用的区别至关重要?

使用传参时,可以通过以下格式进行:

常见错误现象:void foo(int& x) { x = 42; } 调用时传 foo(*p),如果 p 是空指针,程序直接崩溃;而 void bar(int* x) { if (x) *x = 42; } 至少能防御。这不是谁更“安全”,而是责任划分不同:引用要求调用方保证有效性,指针把判空责任留给了函数内部。

  • 需要表达“这个参数必须有效且不可重绑” → 用引用
  • 需要支持“可选、可能为空、或后期重定向” → 用指针
  • 不要为了“省写 *”而把指针换成引用,否则编译不过时会卡在奇怪的地方(比如临时对象绑定到非 const 引用)

返回局部变量时,引用比指针更容易掉进陷阱

返回局部变量的指针是未定义行为,但编译器常不报错;返回局部变量的引用,C++ 标准明确禁止,多数编译器会警告甚至报错,比如 warning: reference to local variable returned

真实场景:有人写 const std::string& getName() { std::string tmp = "abc"; return tmp; },表面看加了 const& 像是延长了生命周期,其实没用——临时对象的生命周期只延长到当前完整表达式结束,函数一返回,引用就悬空。

阅读全文
标签:C

本文共计1188个文字,预计阅读时间需要5分钟。

为什么对C初学者来说,理解指针与引用的区别至关重要?

使用传参时,可以通过以下格式进行:

常见错误现象:void foo(int& x) { x = 42; } 调用时传 foo(*p),如果 p 是空指针,程序直接崩溃;而 void bar(int* x) { if (x) *x = 42; } 至少能防御。这不是谁更“安全”,而是责任划分不同:引用要求调用方保证有效性,指针把判空责任留给了函数内部。

  • 需要表达“这个参数必须有效且不可重绑” → 用引用
  • 需要支持“可选、可能为空、或后期重定向” → 用指针
  • 不要为了“省写 *”而把指针换成引用,否则编译不过时会卡在奇怪的地方(比如临时对象绑定到非 const 引用)

返回局部变量时,引用比指针更容易掉进陷阱

返回局部变量的指针是未定义行为,但编译器常不报错;返回局部变量的引用,C++ 标准明确禁止,多数编译器会警告甚至报错,比如 warning: reference to local variable returned

真实场景:有人写 const std::string& getName() { std::string tmp = "abc"; return tmp; },表面看加了 const& 像是延长了生命周期,其实没用——临时对象的生命周期只延长到当前完整表达式结束,函数一返回,引用就悬空。

阅读全文
标签:C