引用的符号和取地址一样,可以把它理解为取别名,引用变量不会开辟新的空间,它和它引用的对象共用一块内存
int main()
{
int a = 10;
int& b = a;
int& c = b;
}
查看一下三个变量的地址
可以看到它们的地址都是同一个
引用的特性- 引用定义的时候必须初始化
- 一个变量可以进行多个引用
- 引用一旦有了实体,就不能改变
int main()
{
int a = 10;
int& b = a;
int c = 20;
b = c;
}
因为引用对象不能被改变,因此上面代码中的b=c不是b的实体变成c,而是给b赋值,我们可以看看abc的值和地址
我们定义一个变量,不允许它被改变时,我们会加上const关键字,这个时候要引用const变量,引用前面也需要加上const,引用后权限可以相等,可以缩小,不能放大
int main()
{
int a = 10;
const int& b = a; //权限缩小
const int c = 10;
const int& d = c; //权限相等
const int e = 10;
int& f = e; //权限放大 不被允许
}
如果int引用double变量会发生什么事呢
int main()
{
double a = 1.23;
int& b = a; //报错
const int& c = a;
}
为什么不加const会报错呢,因为如果把double赋值给int,会发生类型转换,会有一个临时变量取到double的整型部分然后赋给int,这个临时变量不能被修改,因此int引用double实际上就是引用这个临时变量,要加上const
使用场景之前我们如果写函数去交换两个变量的值,需要传入变量的地址,还要在函数内对地址进行解引用,现在把地址换成引用,直接对引用进行 *** 作即可
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
引用和指针的区别
- 引用定义时要初始化,指针不用
- 引用指定实体后不能更改,指针可以指向任何变量
- 引用不能为NULL,指针可以
- sizeof(引用)是类型的大小,sizeof(指针)是地址大小
- 引用++为值加一,地址++为向后推
- 可以有二级指针,不能二级引用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)