C++:指针与引用

指针&引用

引用

引用“&”是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=10int& b = a;
//a是常量,不能给常量赋值。
const int a=10const 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;

//直接赋值,与引用无关,是两个独立的变量,所以即使影响原来的变量,
也不会影响新产生的变量。

引用的底层实现

最后在讨论下引用的底层实现与指针有什么区别。
还是通过汇编代码来观察
这里写图片描述

其实可以看到在这个地方,指针与引用在底层实现上是没有什么差别的,都是使用指针。
那么这里就要讨论指针与引用的区别:

引用和指针的区别与联系:

  1. 引用只能在定义时初始化一次,之后不能改变指向其他变量,从一而终;指针的指向可以改变。
  2. 引用必须指向有效地变量,指针可以为空。
  3. sizeof指针对象和引用对象的意义不一样,sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。sizeof指针不看类型,++不看对象看类型;
  4. 指针和引用自增和自减含义不同
  5. 相对而言,引用比指针更安全。指针不安全,可能会出现野指针的问题。

“引用”可以做的任何事情,“指针”都可以做到,但为什么还要有引用呢?
答案是:用适当的工具做恰如其分的工作。引用体现了最小特权原则,即给予程序元素足以完成其功能的最小权限。

猜你喜欢

转载自blog.csdn.net/mxrrr_sunshine/article/details/80822092