目录
引用是什么
引用就是取别名
int b=a 是定义一个新的变量,使得其地址处存的值等于a
对b做改变,改变的是b地址处存的值
int& c=a 是对a的一个引用,此时c的地址就是a的地址
对c做改变,就是对a地址处的值做改变
1、可以给a无限个引用(取无限个别名)
2、指针也可以引用,只要是可修改的变量都可以引用( int*& p=p1 )
引用和指针的区别
1、引用必须初始化,应该写做 int& p2=a; 指针可以不初始化,让他指向随机值
2、指针可以初始化指向空; 引用不能初始化指向空
3、引用一旦初始化引用一个实体后,便不能再引用其他实体; 指针可以随便更改指向
4、sizeof中:引用算的是引用类型的大小; 指针算的是本身的大小
5、有多级指针,没有多级引用
1、引用必须初始化,应该写做 int& p2=a; 指针可以不初始化,让他指向随机值
2、指针可以初始化指向空; 引用不能初始化指向空
3、引用一旦初始化引用一个实体后,便不能再引用其他实体; 指针可以随便更改指向
4、sizeof中:引用算的是引用类型的大小; 指针算的是本身的大小
5、有多级指针,没有多级引用
引用有啥用
1、用 引用传参 相比 传值传参 可以大幅降低传递大数据的时间损耗
2、用引用可以做返回值,返回的是变量的地址(但是要注意创建的局部变量出了作用域后会不会销毁)
1、用引用传参可以大幅降低传递大数据的时间损耗
2、用引用可以做返回值(但是要注意创建的局部变量出了作用域后会不会销毁)
注意事项
float a=3.14;
int& p1=a; //会报错
const int& p2=a; //不会报错
这是为什么呢?
这里涉及到C语言中的隐式类型转换
引用有个特点:引用初始化化时,不能放大初始化目标的权限(目标具有不可被修改属性,那么就必须要用const修饰过后的引用来引用目标)
当 float 类型的 a 被p1引用时,因为p1是int&类型的,所以a会隐式类型转换为int。
但是,当发生类型转换时,会产生一个临时变量(具有常属性),而本来要进行的p1=a,就变成了p1=‘常量C’,所以就会报错。
所以当我们在前面加上const就可以通过编译