定义和初始化
- 在定义时必须初始化,且一旦绑定到某个变量,就不能再绑定到其他变量。它是目标变量的别名,本质上和目标变量是同个东西(同个引用)。例如
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 @
2025-01-21 22:05
NAGISB
阅读(
16)
评论()
收藏
举报