引用变量有什么用?

C,C++里面都有引用变量,我只知道函数传参的时候通过引用可以传地址,但是单独声明一个引用变量有什么作用呢?

类似于

int b = 1;
int& a = b;

这样写的意义是什么?仅仅是给一个变量起了另一个名字这种意义吗?

阅读 4.3k
3 个回答

简单来说,其实就是指针,但是可以少写几个符号和降低阅读的难度。就是许多地方不用再写*p&a之类的的操作,尤其是涉及复杂的数据结构的时候。

举个简单的例子,比如 交换两个变量的值的函数:

void swap(int *a,int *b) {int t = *a;*a = *b;*b = t;}
swap(&a,&b); //  调用

void swap(int &a,int &b) {int t = a; a = b; b=t;}
swap(a,b);

在编程语言里,变量指代一段内存,写下变量a就是指那个内存里存储的值。比如写下a = 10; 可能编译出来的结果就是mov [0100H],10,([]相当于取内存地址中值)就是说把10放到内存地址是0100H的地方(举个例子而已就不用 ss sp 了,而且那句汇编也不合法)。机器代码里并没有变量名这个东西,只有内存地址。编程里的变量只是编译器代替我们管理了内存,当我们需要一个地方存储一个东西,我们只需要定义一个变量,编译器自动根据他的算法确定存储的这个东西存储在哪里了,这样就省去了我们直接用内存地址存取数据的工作。

如果int &b = a,这样对于引用变量,写b就相当于*pa,而不能单独写这个“指针”了,pa一直指向a,那么*pa一直都是a。给b(*pa)赋值就是相当于给a赋值。在pa是常数的时候,mov [[pa所在地址]],10 可以等价为mov [0100H],10。这样ab用起来就没有区别了。

这相当于ab代表的是同一段内存。所以在C++里 b叫做a 的别名,意指:有一段内存名叫a,现在给他取了一个另外的名字b

举个例子。
先看看这段伪代码

int cache[1005][1005];
int f(int a, int b)
{
    if (...) return ...;
    int& ret = cache[a][b];
    if (ret != -1) return ret;
    ...
    return ret;
}    

为什么要用ret引用cache呢?是因为如果ret的值发生变化,那么cache[a][b]的值也会发生变化,这样就可以避免每次录入cache[a][b]的麻烦。这个技巧特别适用于cache是多维数组的情况,因为输入错误的下标会更麻烦。

单纯给某个变量取个引用别名是没有意义的。引用的主要意义在于参数传递的速度和空间开销。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题