引用是已定义变量的别名 —— c++ primer plus
语法: int& car_a = car;
该语法表示car_a 是car的别名, 其实car_a完全可以理解为car本身,因为他们地址与值都是相同的。
1. 引用传参与按值传参的区别
(1) 按引用传参传的是实参本身, 按值传参要复制一份内存, 所以引用传参效率更高
(2) 按引用传参可直接操作原始数据, 按值传参在复制的内存上操作数据, 不能修改原始数据
(3) 引用值属于右值, 是可供修改的内存块, 可通过赋值进行修改, 按值传递则是临时内存块, 执行到下一条
语句不再存在
2. 引用传参与指针传参的区别
(1) 首先, int& car_a = car 是 int* const car_a = &car的伪装
(2) 引用具有全局不变性, 终生效忠于一个变量, 指针可以易主,指向其他变量
(3) 引用在使用前必须初始化, 指针没有这个要求
(4) 引用无需分配内存空间, 访问形参就是访问变量本身,是直接访问;指针分配了内存空间存储变量的地址,
需要通过地址找到 指向的变量, 是间接访问(既然引用是常量指针,那么实际上引用还是为指针分配了内存的)
(5) 使用指针的值需要解引用 * , 引用可直接使用变量
(6) 不存在空引用,引用必须指向一块合法的内存
//按引用传参
//交换的就是实参本身
void swapr(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//按指针传参
//传入的是地址,但交换的是存在地址的值
void swapp(int* p, int* q)
{
int temp;
// *是解引用运算符,即p的地址引用,取地址的值
temp = *p;
*p = *q;
*q = temp;
}
//按值传参
//形参复制了实参的新变量,交换的是复制值,并没有改变原值
void swapv(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main ()
{
int car = 10;
int bike = 20;
//引用传参
swapr(car,bike);
cout<<car<<" "<<bike<<endl;
//指针传参
swapp(&car,&bike);
cout<<car<<" "<<bike<<endl;
//按值传参
swapv(car,bike);
cout<<car<<" "<<bike<<endl;
}
结果: