指针&引用
引用
引用“&”是C++新增的概念,这里的“&”不是取地址的语义。
引用不是定义一个新的变量,而是给已经定义的变量重新起一个别名
格式:
类型 &引用变量名 = 以定义的变量名
eg:
int a =10;
int& b = a;
相当于给a取了个别名,叫b。也就是说,b既不是a的拷贝,也不是指向a的指针,实际上就是他自己。
引用的特点:
- 一个变量可取多个别名
- 引用必须初始化
- 引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
指针与引用:
int a = 10;
int* p1 = &a;
const int* p2 = p1;
//权限被缩小,所以是可以的。
int* p1 = &a;
int* const p2 = p1;
//通过,原因:const修饰p2,p2不能变,将p1赋值给p2,仍然是可以的。
int* p3 = &a;
int const* p4 = p3;
//通过,原因:p3为可读可写,赋给p4是只读的,权限被缩小也是可以的。
const int* p1 = &a;
int* p2 = p1;
//不可以,原因:
//const修饰*p1,所以*p1是不可以改变的,
//而p2是int*的,所以是可读可写。p1赋值给p2,权限被放大。
//const* 不可以转换为int*
int const *p1=&a;
int* p2=p1;
//p1是只读,赋值给p2变成只读只写,权限被放大,所以是不通过的。
int* const p3=&a;
int* p4 = p3;
//等价于:
//const int a;
//int b = a;
//b的改变并不会影响a,同样p4的改变不会影响*p3的值。
这里复习一个知识点:
const int* p//const 修饰*p,指向的内容不可改
int const* p//同上
int* const p//指向内容可以被改变,指针本身可以改变
const int* const p//指向内容和指针本身都不可改变
引用作为参数
- 【 值传递 】
- 【引用传递】
- 【指针传递】
例:
//值传递
void Swap(int x,int y)//该函数不能实现交换
{
int tmp=x;
x=y;
y=tmp;
}
//引用传递
void Swap(int& left,int& right)
{
int tmp=left;
left=right;
right=tmp;
}
//指针传递
void Swap(int* px,int* py)
{
int tmp=*px;
*px=*py;
*py=tmp;
}
引用作为参数
- 【传值返回】:
- 【传引用返回】:
结论:
何时使用传值返回?引用返回?
- 出了该作用域,该变量不在,使用传值返回。
- 出了该作用域,该变量还在,使用引用返回。
这里可以通过汇编查看传值返回和引用返回的区别:
扫描二维码关注公众号,回复:
2088397 查看本文章
const引用
const int a=10;
int& b = a;
//a是常量,不能给常量赋值。
const int a=10;
const int& b = a;
//这样就可以了。
const int a = 10;
//常量具有常属性,只有常引用可以引用常量。
double a = 1.1;
int& b=a;//×
//a是double类型,b是int类型,a赋值给b时要生成一个临时变量
//b实际上引用的是这个带有常属性的临时变量,所以不能赋值。
const int& c=a;//√
//常引用可以引用常量
权限可以被缩小,但是不能被放大,这条规则只适用于引用
区分:
int a = 10;
const int b = a;
const int c = 10;
int d = c;
//直接赋值,与引用无关,是两个独立的变量,所以即使影响原来的变量,
也不会影响新产生的变量。
引用的底层实现
最后在讨论下引用的底层实现与指针有什么区别。
还是通过汇编代码来观察
其实可以看到在这个地方,指针与引用在底层实现上是没有什么差别的,都是使用指针。
那么这里就要讨论指针与引用的区别:
引用和指针的区别与联系:
- 引用只能在定义时初始化一次,之后不能改变指向其他变量,从一而终;指针的指向可以改变。
- 引用必须指向有效地变量,指针可以为空。
- sizeof指针对象和引用对象的意义不一样,sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。sizeof指针不看类型,++不看对象看类型;
- 指针和引用自增和自减含义不同
- 相对而言,引用比指针更安全。指针不安全,可能会出现野指针的问题。
“引用”可以做的任何事情,“指针”都可以做到,但为什么还要有引用呢?
答案是:用适当的工具做恰如其分的工作。引用体现了最小特权原则,即给予程序元素足以完成其功能的最小权限。