0

私がここで読んだように:http://www.cplusplus.com/reference/stl/array/operator [] /

と言うa[2]と、の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]、配列内の特定の場所に格納されているオブジェクトの別の名前と見なすことができます。したがって、割り当ては上記の例のように機能します。

于 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 に答える