引用是一种更安全的指针
1、引用必须初始化,而指针可以不用初始化
2、定义一个引用变量,和定义一个指针变量其汇编指令是一样的,通过引用变量修改引用内存的值,和通过指针解引用修改指针指向的值,其底层汇编指令也是一样的
先看看定义
这个是引用
这个是指针
大家可以看到他们的汇编指令是一样的。修改值的操作汇编也是一样的。
3、引用只有一级引用,没有多级引用,而指针有一级指针,也有多级指针
4、概念上引用是给一个空间取别名,而指针是自己占有一个空间,这个空间装的是指向空间的地址。
下面展示一下常用的交换函数写法
void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
void swap(int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
这两个函数得到的结果都一样, 但是传递的参数不一样。第一个传递的是地址,第二个传递的是值。
左值引用和右值引用
先来说一下左值和右值的定义
左值:有内存,有名字,值是可以修改的。
右值:没有内存,没有名字。
但是在C++11标准中,提供了右值引用
int &&C = 20;
这就是右值引用,大家都知道立即数常量是不能用作引用的,因为它是没有空间的。而C++11可以用&&形式进行右值引用,它是专门用来引用右值类型的,指令上会自动产生一个临时空间,然后直接引用临时量,并且可以修改。
注意:不能用一个右值变量,来引用一个左值,因为右值引用会产生一个临时变量,而这个过程没必要产生临时变量。



