-
引用类型
- 引用是一个 别名,它使得你可以通过一个新的名字来 访问已经存在的变量
-
指针类型
- 指针是一个 变量,存储另一个变量的内存地址
说得挺玄乎的,让我们以c为例子,然后再过渡到c++
下面这一段程序很简单,就是把一个变量传给一个函数,然后函数更新这个值
聪明的你肯定发现了问题所在,那就是我们用的是 值传递,也就是说 函数参数是实际参数的副本,所以在函数内的修改不会同步到 实际参数
#include <stdio.h>
void update(int x)
{
x = 999;
}
int main(void)
{
int a = 1;
update(a);
printf("a = %d\n", a);
return 0;
}

那么,我们很快就想到了解决办法,那就是用 指针,来实现 引用传递,让我们能够修改 实际参数 (注意,在 c 中是没有 引用传递 这一说的,只有 值传递,传入指针实际上得到的也是 指针的副本,不过我们可以通过指针来间接修改)
#include <stdio.h>
void update(int *x)
{
*x = 999;
}
int main(void)
{
int a = 1;
update(&a);
printf("a = %d\n", a);
return 0;
}

非常好,我们成功的修改了 函数外部变量 的值
好,在有了上面的基础后,我们再过渡到c++
#include <iostream>
void update(int x)
{
x = 999;
}
int main(void)
{
int a = 1;
update(a);
std::cout << "(cpp) a = " << a << std::endl;
return 0;
}

上面的函数你肯定知道失败的原因了,我就不多提了,然后用指针的办法也不多说了,和c是一样的
接下来我们看看真正的 引用
#include <iostream>
void update(int &x)
{
x = 999;
}
int main(void)
{
int a = 1;
update(a);
std::cout << "(cpp) a = " << a << std::endl;
return 0;
}
注意到了吗,我们的 void update(int &x),我们加上了一个 &,这就是引用传递了
但我们传入参数是,会发生什么呢 ===> int &x = a;,这就创建了一个别名,就相当于告诉编译器,嘿,x和a是同一个东西,不要在拷贝了,既然是同一个东西,那么对 x 的修改自然能够反应在 a 上了
值得一提的是,别名并不会占用额外的空间,他本质上是为了让语法更加简洁可读,因为让代码更好看而浪费空间什么的也太不c++高性能了(:->)
最后提一句,void update(int *&p) 这是合法的,这个意思是 p是你传入的指针的别名,所以对p的修改能够反应到实际参数,在c中的话,我们就得用 二级指针了 void update(int **p)
看到这里是不是对 引用 理解更深了呢
posted on
浙公网安备 33010602011771号