指针与引用

定义和初始化

  • 在定义时必须初始化,且一旦绑定到某个变量,就不能再绑定到其他变量。它是目标变量的别名,本质上和目标变量是同个东西(同个引用)。例如int num=10;int& ref=num; ref就是num的引用
  • 在定义时可不初始化,如果没有初始化,它的值是不确定的,是野指针,使用野指针会导致内存出现未定义行为,例如*ptr定义一个未初始化的指针。当然也可以在定义时初始化,如int *ptr = num

内存占用和底层实现

  • 引用通常通过指针实现的,但在使用上更像是变量别名,在大多下本身不占用额外的内存空间,它和被引用的对象共享同一块内存地址
  • 指针本身就是指针变量,用于存储内存地址,其大小取决于操作系统位数,32位系统占用4字节,64位系统占用8字节
  • int ref=var 相对于 int& ref=var. 前者仅传递值给新的地址(非同个引用), 同个引用的作用本质就是不占用新内存如可变对象

方法论

  • 引用时,直接根据普通变量访问方式,无需额外的表达式来间接访问其绑定的变量,ref=20 来修改num的值
  • 访问指针变量时,需要通过解引用,通过指针法,线性运算,指针元素 来访问指向的数据
  • 引用必须在定义时初始化,指针可在任何时刻初始化
  • 不支持嵌套多级引用,支持嵌套多级指针*(*ptr++)

可空性

  • 引用必须绑定到有效的对象,不能位nullptr,不存在空引用
  • 指针可以为nullptr,标识它不指向任何有效对象

函数传参

  • 当引用定义为形参时,函数内部对引用参数的修改会直接影响到调用函数时传入的外部实参,因为是同个引用,这是高效的传参,避免了对象的拷贝void modifyValue(int &val){val = 20} 会直接修改外部num的值
  • 当指针定义为形参时,同样可通过指针(或被退化指针)来修改所指向的变量, 却需要解引用 void modifyValue(int *ptr){*ptr = 20;}
  • 引用作为参数在某些场景下更为简洁
posted @   NAGISB  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示