1.引用与语法
作用:给变量起别名
语法:数据类型 &别名=原名
数据类型必须与原名一样
注意事项:1:引用必须初始化
2:初始化后不可改变
int &b;//错误的
2.引用作函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修饰实参
//1.值传递
void my01(int a,int b){
int temp=a;
a=b;
b=temp;
cout<<a<<b<<endl;//a=20,b=10
}
int main(){
int a=10,b=20;
my01(a,b);
cout<<a<<b<<endl;//a=10;b=20
}
//2.地址传递
void my02(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
int main(){
int a=10,b=20;
my02(&a,&b);
cout<<a<<b<<endl;//a=20;b=10
}
//3.引用传递
void my03(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
int main(){
int a=10,b=20;
my03(a,b);
cout<<a<<b<<endl;//a=20;b=10
}
引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
//1.栈区失败
int & text01()
{
int a=0;//在栈区
return a;
}
int main(){
int &ref=text01();
cout<<ref<<endl;
}
//失败,因为函数执行结束,局部变量栈内存销毁;返回的引用还保存在这块已经销毁的内存栈地址中,所有变成了野引用,访问就乱码了
//2.全局区成功
int & text02(){
static int a=10;//静态变量,存放在全局区中,在程序结束后释放
return a;
}
int main(){
int &ref=text02();
cout<<ref<<endl;
text02()=1000;
cout<<ref<<endl;//输出1000,如果函数返回值是引用,这个函数调用可以为左值
}
用法:函数调用作为左值
注:左值是有持久身份,有储存单元,能获取地址的对象。可以出现在赋值运算符的左边,也可以取地址。右值是临时值,不能取地址,少数特殊右值(字符串字面量)可以取地址,是特例。
左值可以转换为右值,右值不能自动当为左值。左值通常可以取地址,但存在例外(如位域)。右值一般不能取地址,但字符串字面量等是特例。
3.引用的本质
本质:是一个指针常量
引用的本质是共享地址,底层有地址,传递的不是局部变量的地址,是实参对象的别名
//发现是引用,转换为int* const ref=&a;
void fun(int &ref)
{
ref=100;//ref是引用,转换为*ref=100
}
int main()
{
int a=10;
// 自动转换为 int* const ref = &a; 指针常量指针常量不可改,也说明引用不可改
int &ref=a;
ref=20;//内部发现为引用自动帮我们转换为*ref=20
cout<<a<<endl;//输出20
cout<<ref<<endl;//输出20
fun(a);
cout<<ref<<endl;//输出100
return 0;
}
4.常量引用
作用:修饰形参,防止误操作
int a=10;
int &ref=a;//int &ref=10错误,10是右值(字面量),不能绑定到非const左值引用
const int &ref=10;//正确的,加上const,编译器改为int temp=10 ;const int &ref=temp;加入const 变为只读了,不可以修改





