I was just reading some code and found that the person was using arr[-2] to access the 2nd element before the arr, like so:
|a|b|c|d|e|f|g|
^------------ arr[0]
^---------- arr[1]
^---------------- arr[-2]
Is that allowed?
I know that arr[x] is the same as *(arr + x). So arr[-2] is *(arr - 2), which seems OK. What do you think?
That is correct. From C99 §6.5.2.1/2:
There’s no magic. It’s a 1-1 equivalence. As always when dereferencing a pointer (*), you need to be sure it’s pointing to a valid address.