C/C++ 禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容;
但是在 C++ 中,我们有了一种比指针更加便捷的传递聚合类型数据的方式,那就是引用(Reference)。
引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。
引用类似于 Windows 中的快捷方式,一个可执行程序可以有多个快捷方式,通过这些快捷方式和可执行程序本身都能够运行程序;
引用的定义方式类似于指针,只是用&取代了*,语法格式为:

  1. type &name = data;

注意,引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址。
由于引用 r 和原始变量 a 都是指向同一地址,所以通过引用也可以修改原始变量中所存储的数据,

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. int a = 99;
  5. int &r = a;
  6. r = 47;
  7. cout << a << ", " << r << endl;
  8. return 0;
  9. }

如果读者不希望通过引用来修改原始的数据,那么可以在定义时添加 const 限制,

引用和指针的区别

1) 引用必须在定义时初始化,并且以后也要从一而终,不能再指向其他数据;而指针没有这个限制,指针在定义时不必赋值,以后也能指向任意数据。
2) 可以有 const 指针,但是没有 const 引用。也就是说,引用变量不能定义为下面的形式:
3) 指针可以有多级,但是引用只能有一级,例如,int **p是合法的,而int &&r是不合法的。如果希望定义一个引用变量来指代另外一个引用变量,那么也只需要加一个&
4) 指针和引用的自增(++)自减(—)运算意义不一样。对指针使用 ++ 表示指向下一份数据,对引用使用 ++ 表示它所指代的数据本身加 1;自减(—)也是类似的道理。

概括起来说,将引用类型的形参添加 const 限制的理由有三个:

  • 使用 const 可以避免无意中修改数据的编程错误;
  • 使用 const 能让函数接收 const 和非 const 类型的实参,否则将只能接收非 const 类型的实参;
  • 使用 const 引用能够让函数正确生成并使用临时变量。