首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组[]操作符返回引用,那么如何更改它的值?

数组[]操作符返回引用,那么如何更改它的值?
EN

Stack Overflow用户
提问于 2012-11-03 11:51:41
回答 2查看 107关注 0票数 0

正如我在这里所读到的:http://www.cplusplus.com/reference/stl/array/operator[]/

a[2]似乎会返回a的第二个元素的内存地址(引用)。

所以你怎么样?

代码语言:javascript
复制
a[2]=5

有效的赋值,因为这意味着我将a[2]的内存地址更改为位置5(这可能是可能的,但通常您希望更改值,而不是地址)。除非=操作符知道如何处理这种情况。

我知道它不会改变内存地址,那么这里到底发生了什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-03 11:54:25

引用和指针之间的区别是引用是自动取消引用的。因此,您不需要像*(a[2]) = 5这样的东西。

下面的代码显示了这一点:

代码语言:javascript
复制
int baseVar = 42;            // This
int &sameVar = baseVar;      //   and this are the same memory
                             //   with two different names.
int *pBaseVar = &baseVar;    // This is separate memory that happens
                             //   to point to the baseVar memory.

改变sameVar*pBaseVar都会改变baseVar本身。更改pBasevar本身不会影响basevar,它只会导致前者指向不同的位置。

在幕后(当然,这是与实现相关的),basevar可能(被编译器/代码)认为是特定地址上的int (例如0x12345678),sameVar也被认为是。

pBaseVar被认为是(例如) 0x11112222的指针,它恰好包含值0x12345678

代码语言:javascript
复制
                      +------------+
pBaseVar (0x11112222) | 0x12345678 |--+
                      +------------+  |
   +----------------------------------+
   |
   V                  +----+
baseVar (0x12345678)  | 42 |
sameVar (same)        |    |
                      +----+
票数 3
EN

Stack Overflow用户

发布于 2012-11-03 11:53:40

引用不是内存地址。将其视为同一对象的不同名称:

代码语言:javascript
复制
int i = 42;
int& j = i; // j is another name for i

j = 55;

std::cout << i << "\n"; // i now has value 55

因此,a[2]可以被看作是存储在数组中某个位置的任何对象的不同名称。因此,转让人的工作方式与上面的示例一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13208887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档