C,C++里面都有引用变量,我只知道函数传参的时候通过引用可以传地址,但是单独声明一个引用变量有什么作用呢?
类似于
int b = 1;
int& a = b;
这样写的意义是什么?仅仅是给一个变量起了另一个名字这种意义吗?
C,C++里面都有引用变量,我只知道函数传参的时候通过引用可以传地址,但是单独声明一个引用变量有什么作用呢?
类似于
int b = 1;
int& 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是多维数组的情况,因为输入错误的下标会更麻烦。
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
简单来说,其实就是指针,但是可以少写几个符号和降低阅读的难度。就是许多地方不用再写
*p
、&a
之类的的操作,尤其是涉及复杂的数据结构的时候。举个简单的例子,比如 交换两个变量的值的函数:
在编程语言里,变量指代一段内存,写下变量
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
。这样a
和b
用起来就没有区别了。这相当于
a
和b
代表的是同一段内存。所以在C++里b
叫做a
的别名,意指:有一段内存名叫a
,现在给他取了一个另外的名字b
。