对一个数据可以建立一个“引用”,作用是为一个变量起一个别名。这是C++对C的一个重要扩充。
int a; //定义a是整型变量
int &b = a; //声明b是a的引用
声明了b是a的引用,即b是a的别名。经过这样的声明后,使用a或b的作用相同,都代表同一变量。
可以这样理解引用:声明b为引用,并不需要另外开辟内存单元来存放b的值。b和a占内存中同一个存储单元,它们具有同一地址。即使变量b具有变量a的地址。
注意:
1. 引用不是一种独立的数据类型,对引用只有声明,没有定义。必须先定义一个变量,然后声明对该变量建立一个引用(别名)。
2. 声明一个引用时,必须同时使之初始化,即声明它代表哪一个变量。当引用作为函数的形参时不必在声明中初始化,它的初始化是在函数调用时的虚实结合实现的,即作为形参的引用是实参的别名。
3. 在声明一个引用后,不能再使之作为另一个变量的引用。比如声明了b是变量a的引用后,在其有效作用范围内,b始终与其代表的变量a相联系,不能再作为其他变量的引用。
int a1,a2;
int &b=a1;
int &b=a2; //错误。试图使b又变成a2的引用,不合法
4. 不能建立引用数组。如:
int a[5];
int &b[5]=a; //错误,不能建立引用数组
int &b=a[0]; //错误,不能作为数组元素的别名
5. 不能建立引用的引用。如:
int a=3;
int &b=a; //正确
int &c=b; //错误
6. 不能建立指向引用的指针。 如:
int a=3;
int &b=a;
int *p=b; //错误
7. 可以取引用的地址。如已经声明b是a的引用,那么&b就是变量a的地址&a.
int *pt;
pt=&b; //把变量a的地址&a赋给指针变量pt
8. 区别引用声明符& 和取地址运算符&。出现在声明中的&是引用声明符,其他情况下的&是取地址运算符。
二者形式相同,含义不同。在声明了引用之后,在使用它时不带&,而只用引用的名字(如b,而不是&b)。