引用是某个对象(变量)的别名
形式如下: 类型名 &引用名=变量名;
例如:
#include <iostream>
using namespace std;
int main()
{
int i=4;
int &r=i;
cout<<r;
}
r和i其实是同一对内存变量,对r的操作就是对i的操作。
在使用引用是有一下几点需要注意:
1.在定义引用时&的位置是灵活的 无关于type之间有几个空格
2.在声明变量的时候的&才是引用运算符,在其他地方看做是取地址运算符
int i;
int &ir=i;//引用
int &f(int &il,int &);//引用参数,函数返回引用
int *p=&i;//qud取地址
cout<<&i;//q取i的地址;
3.引用必须在定义是初始化,不能在定义之后在对期赋值,为引用提供初始值,同一个变量可以有多个引用,为其提供初始值时,可以是一个变量也可以是一个引用。
int &f;//错误,未进行初始化
int f;
int &f1=f;//正确
int &f2=f1;//正确
4.引用其实是一种隐式的指针,但是他与指针的用法之间存在区别。
区别一:指针必须通过才能访问他所指向的内存单元,但是引用不需要就可以访问其代表的内存单元;
区别二:指针是一个变量,可以对其重新赋值,让他指向另外的地址,但是引用必须在定义时进行初始化,而且一经定义不能再作为其他变量的引用了,下面这个例子很好的说明了这一点
在定义初始引用之后在对其赋值另一个,相当于是只把值给引用,但是引用还代表刚刚开始的那个。
5.当用&运算符获取一个引用的地址时,实际取出的是引用对应变量的地址。
6.在使用引用时要注意一下几个限制:
1.不能建立引用的引用(前面说的是用引用给引用初始化)
2.不能建立引用的数组,也不能建立数组的引用
3.可以建立指针的引用,但是不能创建引用的指针
#include <iostream>
using namespace std;
int main()
{
int i=0;a[10];
int &aa=a;//错误,aa是数组的引用
int &ia[5]//错误,ia是引用的数组
int &*p=i;//c错误,是ip是指向引用的数组
int &&i;//cuowu错误,ii是引用的引用
int *pi=&i;
int *&pr=pi;//正确,pr是指针的引用
}
7.引用与左值,对于每个变量都有左值和右值,左值是指变量对应的那块内存区域的地址,是“可以放在赋值号左边的值”;右值是指变量对于内存区域中储存的数据值,是可以“放在赋值号右边的值”。
引用是一个左值,也就是说,引用一定与某块内存区域相对应,能够放在赋值号的左边。