On Mon, 01 Apr 2013 20:07:30 -0400, Luís Marques <luismarq...@gmail.com>
wrote:
Consider this (non-portable) code:
{
int[2] a;
int[2] b;
int[2] *c;
c = &a;
c[0] = 7;
assert(a[0] == 7); // OK, as expected
c[1] = 42;
assert(b[0] == 42); // do we really want this semantics?
}
Because indexing c automatically dereferences the pointer, "c[0] = 7"
assigns to a[0], as expected. This is the same as "(*c)[0] = 7", which
is useful.
This is not what is happening. If you add:
writeln(a);
you will see:
7, 7
You see, indexing does NOT dereference the pointer, it's an index for that
pointer. c[0] means *(c + 0). A pointer is essentially an unchecked
slice, with undefined length. This is how it works in C also.
c[1] is the same as *(c + 1), completely consistent (and also sets b to
42, 42)
-Steve