0

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

看来,sayinga[2]会返回 . 的第二个元素的内存地址(引用)a

那么怎么样

a[2]=5

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

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

4

2 回答 2

3

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

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]可以看作是存储在数组中某个位置的任何对象的不同名称。因此,assignemnt 就像上面的例子一样工作。

于 2012-11-03T11:53:40.203 回答
3

引用和指针之间的区别在于引用是自动取消引用的。因此,您不需要诸如*(a[2]) = 5.

以下代码显示了这一点:

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

                      +------------+
pBaseVar (0x11112222) | 0x12345678 |--+
                      +------------+  |
   +----------------------------------+
   |
   V                  +----+
baseVar (0x12345678)  | 42 |
sameVar (same)        |    |
                      +----+
于 2012-11-03T11:54:25.417 回答