int& r = i VS int r = i
内存的分配不同,后者会重新开辟一个内存空间。
#include <iostream>
using namespace std;
int main ()
{
int i;
int& r = i;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
cout << "Addr of i: " << &i << endl;
cout << "Addr of r: " << &r << endl;
int x;
int y = x;
x = 6;
cout << "Value of x : " << x << endl;
cout << "Value of y : " << y << endl;
cout << "Addr of x: " << &x << endl;
cout << "Addr of y: " << &y << endl;
return 0;
}
输出结果:
Value of i : 5
Value of i reference : 5
Addr of i: 0x7fff59cda988
Addr of r: 0x7fff59cda988
Value of x : 6
Value of y : 32767
Addr of x: 0x7fff59cda97c
Addr of y: 0x7fff59cda978
必须在声明中将其初始化
int i;
int &b=i;// 相当于给i重新取了一个外号
#include <iostream>
using namespace std;
int main()
{
int rats = 100;
int &rodent = rats;
cout << "rats = "<<rats<<", rosent = "<<rodent<<endl;
cout << "rats address = "<<&rats<<endl;
cout << "rosent address = "<<&rodent<<endl;
cout <<"==================================="<<endl;
int bunnies = 50;
rodent = bunnies;
cout << "rats = "<<rats<<", rosent = "<<rodent<<", bunnies = "<<bunnies<<endl;
cout << "rats address = "<<&rats<<endl;
cout << "rosent address = "<<&rodent<<endl;
cout << "bunniess address = "<<&bunnies<<endl;
return 0;
}
输出结果:
rats = 100, rosent = 100
rats address = 0xbfce21e4
rosent address = 0xbfce21e4
===================================
rats = 50, rosent = 50, bunnies = 50
rats address = 0xbfce21e4
rosent address = 0xbfce21e4
bunniess address = 0xbfce21e8
从结果可以看出,虽然在调用 rodent = bunnies; 后引用 rosent 的值变为 50,但是 rosent 所指向的地址空间还是指向了 rats,没有发生改变,说明 rodent = bunnies; 只是将 bunnies 的值赋值给引用 rodent 所指向的变量,没有改变引用的指向。
定义一个指针的引用
int *&q = p; //定义一个指针的引用,即q为p的别名。 定义方法:类型 *&指针引用名 = 指针
引用的实际应用
//将两个值进行交换
//使用指针的方法
void fun( int *a,int *b) //形参为两个整型的指针变量
{
int temp = 0; //定义一个临时变量。良好的习惯是定义一个变量并初始化它;
c = *a; //将*a赋值给c;
*a = *b; //将*b赋值给*a;
*b = c; //再将c赋值给*b;这样就完成了a、b数值的交换
}
int x = 10,y = 20;
fun(&x,&y); //在主函数中调用时,传过去的实参需要写成 取地址a,取地址b,比较麻烦,也不易理
//解。
//使用引用的方法
void fun (int &a, int &b) //形参为两个整型的引用
{
int temp = 0;
c = a;
a = b;
b = c;
}
int x = 10,y = 20;
fun(x,y); //在主函数中调用时,实参传过去后a是x的别名,b是y的别名。