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

Reply via email to