1.什么是变量的引用

    • 变量的别名
    • 引用作为函数参数时,在函数调用中实现值的双向传递
    • 引用的格式: <类型> &**<引用变量名>** = <原变量名>;

      • 原变量名必须是一个已定义过的变量;
      • 例:
        1. int a;
        2. int &b = a;
        3. //b是a的引用,a或b的作用相同,都代表同一变量。
    • 注意:

      • &是引用声明符,并不代表地址。
      • 声明变量b为引用类型,并不需要另外开辟内存单元来存放b的值。b和a内存中的同一存储单元,具有同一地址。
      • 声明b是a的引用可以理解为使变量b具有变量a的地址。、

        1. ![批注 2020-08-14 200217.png](https://cdn.nlark.com/yuque/0/2020/png/2314091/1597406549593-31c0aa1c-1fd5-4df5-bc42-abb78468fa6c.png#align=left&display=inline&height=141&margin=%5Bobject%20Object%5D&name=%E6%89%B9%E6%B3%A8%202020-08-14%20200217.png&originHeight=188&originWidth=352&size=13337&status=done&style=none&width=264)
    • 在声明一个引用类型变量时,必须同时使之初始化,即声明它代表哪一个变量;

    • 在声明变量b是变量a的引用后,在它们所在函数执行期间, 该引用类型变量b始终与其代表的变量a相联系,不能再作为其他变量的引用(别名)。
    • 非法的声明
    1. 企图建立数组的引用 int & a[9];
    2. 企图建立指向引用的指针 int & *p;
    3. 企图建立引用的引用 int & &px;

    2.引用的简单使用

    #include <iostream> 
    #include <iomanip> 
    using namespace std;
    int main( ) 
    {int a=10; 
     int &b=a; 
     a=a*a; 
     cout<<a<<setw(6)<<b<<endl;
     b=b/5; 
     cout<<b<<setw(6)<<a<<endl; 
     return 0; 
    }
    

    3.引用作为函数参数

    • 指针变量作形参,实现两个变量的值互换。 ```cpp int i=3,j=5; swap(&i,&j);

    void swap(int p1,int p2) { int temp; temp=p1; p1=p2; p2=temp; }

    
       - 这种虚实结合的方法仍然是“值传递”方式,只是实参的值是变量的地址。
    - 引用传递和使用指针变量作形参有何不同?
       - 指针变量要另外开辟内存单元,其内容是地址;而引用变量不是一个独立的变量,不单独占内存单元。
       - 使用变量的引用,可以部分代替指针的操作。
       - 引用作为函数参数比使用指针变量简单、直观、方便。
    
    - 用引用作形参:对3个变量按由小到大的顺序排序
    ```cpp
    #include <iostream>
    using namespace std;
    int main( )
    {void sort(int &,int &,int &); //函数声明,形参是引用类型 
     int a,b,c; //a,b,c是需排序的变量 
     int a1,b1,c1; //a1,b1,c1最终的值是已排好序的数列 
     cout<<″Please enter 3 integers:″;
     cin>>a>>b>>c; //输入a,b,c 
     a1=a;b1=b;c1=c;
     sort(a1,b1,c1); //调用sort函数,以a1,b1,c1为实参 
     cout<<″sorted order is ″<<a1<<″ ″<<b1<<″ ″<<c1<<endl;//此时 a1,b1,c1已排好序 
     return 0; }
    void sort(int &i,int &j,int &k) //对i,j,k 3个数排序
    {void change(int &,int &); //函数声明,形参是引用类型
     if (i>j) change (i,j); //使i<=j 
     if (i>k) change (i,k); //使i<=k 
     if (j>k) change (j,k); //使j<=k 
    }
    void change (int &x,int &y) //使x和y互换 
    {int temp; 
     temp=x; 
     x=y; 
     y=temp;
    }
    
    • 对引用类型变量的说明

      • 引用在定义的时候要初始化;
      • 对引用操作就是对被引用的变量的操作;
      • 对引用类型变量的初始化值不能是一个常数;
      • 引用同变量一样有地址,可以对其地址进行操作,即将其地址赋给一指针;

        int a=10,*p;
        int &m=a;
        p=&m;
        *p=10;
        
      • 引用不仅可以用于变量,也可以用于对象;

      • 当看到&a这样的形式时,如何区分是声明引用变量还是取地址的操作?
        • 当&a的前面有类型符时,它必然是对引用的声明;
        • 如果前面无类型符,则是去变量的地址。