引用的语法及作用:

//语法:    数据类型 &变量名=变量;     举例如下:
int a=10;
int &b=a;
//作用:
//经过引用之后,a就相当于b,同一地址,具有两个变量名称,
//对b的任何操作等价于对b的操作。
//例如,int c=b; 就相当于int c=a。

注意事项:

(1)引用必须初始化,例如 int &a;这是错误的,因为a没有初始化。

(2)引用在初始化后不可以再改变,例如,int &b=a;b=c;上面的语句只会将c的值赋值给b,而不是让b成为c的别名。

引用作为函数的参数:

//函数传参时,就相当于int &a=a;int &b=b;传参就相当于赋值。
//引用的本质就是指针常量。
 int swap(&a,&b)
 {
       int c=a;
       a=b;
       b=c;
 }
 ……
 //传参依然传的是地址,会改变a,b的值
 swap(&a,&b);

引用作为函数的返回值:

//不要返回局部变量的引用,因为局部变量开辟在栈区,
//函数调用结束过后就会自动释放该变量,造成后续使用该变量时非法访问
int &test01()
{
      int a=10;    
     return a;
}
//以上是错误的,正确方式如下




// 将返回的变量a引用为&test01,相当于int &test01()=a;
int &test01()
{
    static int a=20;   //静态变量,存放在全局区,由系统自动释放
    return a;
}
//这样,函数的调用就可以作为左值了
test02()=1000;

引用的本质是一个指针常量:

int a=10;

int &b=a;编译器编译时,自动将该变量转换为 int* const b=&a;

常量引用:

//语法举例:
const int &a=10;
//上面个语句就相当于 int temp=10;const int& a=10;
//但实际上常量引用仓用来修饰形参,防止误操作。例如:
int show(const int &p)
{
  // p=100;错误,无法修改p的值
  printf("%d\n",p);
}